【发布时间】:2020-05-23 17:52:33
【问题描述】:
我有两个列表,['A', 'B', 'C', 'D'] 和 [1, 2, 3, 4]。两个列表将始终具有相同数量的项目。我需要将每个字符串乘以它的数字,所以我要寻找的最终产品是:
['A', 'B', 'B', 'C', 'C', 'C', 'D', 'D', 'D', 'D']
【问题讨论】:
我有两个列表,['A', 'B', 'C', 'D'] 和 [1, 2, 3, 4]。两个列表将始终具有相同数量的项目。我需要将每个字符串乘以它的数字,所以我要寻找的最终产品是:
['A', 'B', 'B', 'C', 'C', 'C', 'D', 'D', 'D', 'D']
【问题讨论】:
嵌套列表理解也有效:
>>> l1 = ['A', 'B', 'C', 'D']
>>> l2 = [1, 2, 3, 4]
>>> [c for c, i in zip(l1, l2) for _ in range(i)]
['A', 'B', 'B', 'C', 'C', 'C', 'D', 'D', 'D', 'D']
在上面的zip 返回(char, count) 元组:
>>> t = list(zip(l1, l2))
>>> t
[('A', 1), ('B', 2), ('C', 3), ('D', 4)]
然后对每个元组执行第二个for 循环count 次以将字符添加到结果中:
>>> [char for char, count in t for _ in range(count)]
['A', 'B', 'B', 'C', 'C', 'C', 'D', 'D', 'D', 'D']
【讨论】:
我会使用itertools.repeat 来实现一个不错、高效的实现:
>>> letters = ['A', 'B', 'C', 'D']
>>> numbers = [1, 2, 3, 4]
>>> import itertools
>>> result = []
>>> for letter, number in zip(letters, numbers):
... result.extend(itertools.repeat(letter, number))
...
>>> result
['A', 'B', 'B', 'C', 'C', 'C', 'D', 'D', 'D', 'D']
>>>
我也觉得它的可读性很好。
【讨论】:
代码非常简单,见内联 cmets
l1 = ['A', 'B', 'C', 'D']
l2 = [1, 2, 3, 4]
res = []
for i, x in enumerate(l1): # by enumerating you get both the item and its index
res += x * l2[i] # add the next item to the result list
print res
输出
['A', 'B', 'B', 'C', 'C', 'C', 'D', 'D', 'D', 'D']
【讨论】:
您使用zip() 这样做:
a = ['A', 'B', 'C', 'D']
b = [1, 2, 3, 4]
final = []
for k,v in zip(a,b):
final += [k for _ in range(v)]
print(final)
输出:
>>> ['A', 'B', 'B', 'C', 'C', 'C', 'D', 'D', 'D', 'D']
或者你也可以这样做,使用zip()和list comprehension:
a = ['A', 'B', 'C', 'D']
b = [1, 2, 3, 4]
final = [k for k,v in zip(a,b) for _ in range(v)]
print(final)
输出:
>>> ['A', 'B', 'B', 'C', 'C', 'C', 'D', 'D', 'D', 'D']
【讨论】: