连接彼此之间不同长度的两个列表

时间:2016-12-07 12:01:11

标签: python concatenation

我有两个不同大小的列表,n和n-1。我必须连接两个看起来像这样的列表

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

他们必须连接起来才能得到像这样的

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 = ['*','-']

9 个答案:

答案 0 :(得分:2)

您可以使用itertools 许多可能性,例如

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

答案 1 :(得分:1)

请尝试以下操作:

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)

答案 2 :(得分:1)

试试这个,

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'

答案 3 :(得分:0)

假设您的列表始终正确,您可以执行以下操作:

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)

同时迭代这两个列表,然后从list1然后从list2添加一个项目。当循环终止时,您在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)

答案 4 :(得分:0)

您可以使用 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'

答案 5 :(得分:0)

this answer借用有关交错列表的内容:

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

答案 6 :(得分:0)

您可以对第一个列表进行切片以获得与第二个列表长度相同的子列表,然后将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'

答案 7 :(得分:0)

有几个外部软件包具有内置函数,用于这种&#34;交错&#34;迭代,只是为了展示其中一个: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只是一个包裹''.join来电。

仅举几个例子:

这些是广义的解决方案,适用于任意数量的序列和迭代。只有两个可迭代项,如果您不想使用zipitertools.zip_longest方法(请参阅其他答案)来使用外部包,则可能更容易。

答案 8 :(得分:-2)

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)