我有两个想要合并的列表,但我不想增加列表中的项目数量,而是想加入具有匹配索引的项目。例如:
List1 = ['A', 'B', 'C']
List2 = ['1', '2', '3']
List3 = ['A1', 'B2', 'C3']
我已经看到了很多关于简单组合两个列表的其他问题,但恐怕我还没有找到任何可以实现的目标。
任何帮助将非常感激。干杯。
我有两个想要合并的列表,但我不想增加列表中的项目数量,而是想加入具有匹配索引的项目。例如:
List1 = ['A', 'B', 'C']
List2 = ['1', '2', '3']
List3 = ['A1', 'B2', 'C3']
我已经看到了很多关于简单组合两个列表的其他问题,但恐怕我还没有找到任何可以实现的目标。
任何帮助将非常感激。干杯。
>>> List1 = ['A', 'B', 'C']
>>> List2 = ['1', '2', '3']
>>> [x + y for x, y in zip(List1, List2)]
['A1', 'B2', 'C3']
>>> List1 = ['A', 'B', 'C']
>>> List2 = ['1', '2', '3']
>>> map(lambda a, b: a + b, List1, List2)
['A1', 'B2', 'C3']
map(''.join,zip(List1,List2,List3))
>>>
['A1A1', 'B2B2', 'C3C3']
解释:
zip(List1,List2,List3)
退货
[('A', '1', 'A1'), ('B', '2', 'B2'), ('C', '3', 'C3')]
N
每个元组表示与压缩列表中的索引关联的元素。我们希望将每个元组中的元素组合成一个字符串。对于单个元组,我们可以去:
>>> ''.join(('A', '1', 'A1'))
'A1A1'
为了产生所需的结果,从而获得所有所需字符串的列表,我们将此join
函数映射到所有元组,如下所示:
map(''.join,zip(List1,List2,List3))
导致
['A1A1', 'B2B2', 'C3C3']
因此,如果您只想添加List1
并且List2
map(''.join,zip(List1,List2))
>>>
['A1', 'B2', 'C3']
一些时间:
Microsoft Windows [Version 6.2.9200]
(c) 2012 Microsoft Corporation. All rights reserved.
C:\Users\Henry>python -m timeit -s "List1 = ['A', 'B', 'C']*10**5; List2 = ['1', '2','3']*10**5" "map(lambda x, y: x + y, List1, List2)"
10 loops, best of 3: 44 msec per loop
C:\Users\Henry>python -m timeit -s "List1 = ['A', 'B', 'C']*10**5; List2 = ['1', '2', '3']*10**5" "[x + y for x, y in zip(List1, List2)]"
10 loops, best of 3: 44 msec per loop
C:\Users\Henry>python -m timeit -s "List1 = ['A', 'B', 'C']*10**5; List2 = ['1', '2', '3']*10**5" "map(''.join,zip(List1,List2))"
10 loops, best of 3: 42.6 msec per loop
C:\Users\Henry>python -m timeit -s "from operator import add" "List1 = ['A', 'B', 'C']*10**5; List2 = ['1', '2', '3']*10**5" "map(add, List1, List2)"
10 loops, best of 3: 28.6 msec per loop
并使用izip而不是zip
Microsoft Windows [Version 6.2.9200]
(c) 2012 Microsoft Corporation. All rights reserved.
C:\Users\Henry>python -m timeit -s "List1 = ['A', 'B', 'C']*10**5; List2 = ['1', '2','3']*10**5" "map(lambda x, y: x + y, List1, List2)"
10 loops, best of 3: 44.1 msec per loop
C:\Users\Henry>python -m timeit -s "from itertools import izip" "List1 = ['A', 'B', 'C']*10**5; List2 = ['1', '2', '3']*10**5" "[x + y for x, y in izip(List1, List2)]"
10 loops, best of 3: 31.3 msec per loop
C:\Users\Henry>python -m timeit -s "from itertools import izip" "List1 = ['A', 'B', 'C']*10**5; List2 = ['1', '2', '3']*10**5" "map(''.join,izip(List1,List2))"
10 loops, best of 3: 36.2 msec per loop
C:\Users\Henry>python -m timeit -s "from operator import add" "List1 = ['A', 'B', 'C']*10**5; List2 = ['1', '2', '3']*10**5" "map(add, List1, List2)"
10 loops, best of 3: 28.6 msec per loop
增加多样性(Python 2.7)
List3 = ['{}{}'.format(x, y) for x, y in zip(List1, List2)]
从许多其他答案中可以看出,在 python 中有多种方法可以解决这个问题。这是一个这样的例子:
>>> from operator import add
>>> List1 = ['A', 'B', 'C']
>>> List2 = ['1', '2', '3']
>>> map(add, List1, List2)
['A1', 'B2', 'C3']
不过,您本质上要寻找的是zipWith
,我链接到 hoogle 只是因为它易于解释,并且在 python 中没有 zipWith 的标准实现。它的意思是你提供zipWith
一个二元函数,例如operator.add
,和两个列表,它返回列表zip
以及应用于每对的函数。
您可以将这个想法抽象出来,以便使用二元运算符对两个以上的列表进行操作。
>>> def zipWith(f, *iterables):
... return map(f, *iterables)
旁白:这似乎没有做太多,但它提供了关于正在发生的事情的语义。它正在zip
使用该函数对迭代进行 ping 操作。这比仅使用地图版本更具可读性。
然后,只要将输入列表的数量与函数的数量相匹配,就可以将它与任何函数一起使用f
。例如:
>>> zipWith(lambda a, b, c: a + b * c, [1, 2, 3], [1, 2, 3], [1, 2, 3])
[2, 6, 12]
>>> zipWith(lambda a, b, c: (a + b) * c, List1, List2, [1, 2, 3])
['A1', 'B2B2', 'C3C3C3']
>>> zipWith(lambda a, b: a + b, List1, List2)
['A1', 'B2', 'C3']
>>> zipWith(add, List1, List2)
['A1', 'B2', 'C3']