簡體   English   中英

將兩個不同長度的列表彼此連接起來

[英]Concatenate two lists of different length in between each other

我有兩個不同大小的列表,n 和 n-1。 我必須連接兩個看起來像這樣的列表

list1 = ['a','b','c']
list2 = ['-','-']

它們必須連接起來才能像這樣得到 s.th

str_out = 'a-b-c'

我試圖找出一種優雅的方法來做到這一點,但只設法提出了這個解決方案

list1 = ['a','b','c']
list2 = ['-','-']
string2 = ''

for index,item in enumerate(list1):
    string2 = string2 + item + list2[index-1]

print(string2)

哪個打印

'a-b-c-'

我正在尋找更好的實現或如何擺脫最后的破折號 ( - )

編輯:澄清一下,列表將是動態的,並且 list2 可以包含任意字符。

例如: list2 = ['*','-']

您可能會使用itertools許多可能性,例如

list1 = ['a', 'b', 'c']
list2 = ['-', '*']
''.join(map(''.join, itertools.izip_longest(list1, list2, fillvalue='')))
''.join(itertools.chain(*itertools.izip_longest(list1, list2, fillvalue='')))

嘗試以下操作:

from itertools import chain
"".join(x for x in chain(*map(None, list1, list2)) if x is not None)

更新添加 izip_longest 版本:

from itertools import chain, izip_longest
"".join(x for x in chain(*izip_longest(list1, list2)) if x is not None)

更新py3版本:

from itertools import chain, zip_longest
"".join(x for x in chain(*zip_longest(list1, list2)) if x is not None)

嘗試這個,

In [32]: ''.join(i+j for i,j in zip(list1,list2+['']))
Out[32]: 'a-b-c'

只需在list2末尾添加一個黑色 ( '' ) 元素。 然后只需應用zipjoin

嘗試了另一個例子,

In [36]: list2 = ['*','-']
In [37]: ''.join(i+j for i,j in zip(list1,list2+['']))
Out[37]: 'a*b-c'

假設您的列表始終正確,您可以執行以下操作:

list1 = ['a','b','c']
list2 = ['-','-']

res = []
for i1, i2 in zip(list1, list2):
    res.append(i1)
    res.append(i2)

res.append(list1[-1])

print ''.join(res)

同時迭代這兩個列表,然后從list1list2添加一個項目。 當循環終止時,您在list1還有一個項目,您可以手動追加。

另一種解決方案是為每個列表設置一個單獨的計數器:

list1 = ['a','b','c']
list2 = ['-','-']

res = []
j = 0
for i1 in list1:
    res.append(i1)
    if j < len(list2):
        res.append(list2[j])
        j += 1

print ''.join(res)

您可以使用NumPy 數組,因為它們的索引工具對於 OP 的目的非常有用:

list1 = np.array(['a','b','c'])
list2 = np.array(['*','-'])
final_list = np.zeros(len(l1) + len(l2)).astype('S1')
list3[0::2] = list1
list3[1::2] = list2

result_string = ''.join(list3)

結果將是:

'a*b-c'

這個關於交錯列表的答案中借用:

''.join(val for pair in zip(list1, list2) for val in pair) + list1[-1]

您可以對第一個列表進行切片以獲得與第二個列表長度相同的子列表,然后將zip()應用於結果。 extend用於添加第一個列表的其他元素:

list1 = ['a','b','c']
list2 = ['-','-']

my_list = [''.join(item) for item in zip(list1[:len(list2)], list2)]
my_list.extend(list1[len(list2):])
str_out = ''.join(my_list)
print(str_out)
# Output: 'a-b-c'

有幾個外部包具有用於這種“交錯”迭代的內置函數,只是為了顯示其中之一: iteration_utilities.roundrobin (注意,我是這個庫的作者):

>>> from iteration_utilities import ManyIterables
>>> ManyIterables(['a','b','c'], ['-','-']).roundrobin().as_string()
'a-b-c'
>>> ManyIterables(['a','b','c'], ['-','*']).roundrobin().as_string()
'a-b*c'

as_string只是一個包裝as_string ''.join調用。

僅舉幾個替代方案:

這些是適用於任意數量的序列和可迭代對象的通用解決方案。 只有兩個可迭代對象,如果您不想使用zipitertools.zip_longest方法(請參閱其他答案)使用外部包,則可能更容易。

from itertools import zip_longest,chain
list1 = ['a','b','c']    
list2 = ['*','-']
''.join(i+j for i,j in zip_longest(list1, list2, fillvalue=''))

或者:

list1 = ['a','b','c']    
list2 = ['*','-']
def item_gen(list1, list2):
    for i,j in zip(list1, list2):
        yield i
        yield j
    yield list1[-1]

each = item_gen(list1, list2)
''.join(each)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM