我有2个列表
W = ['w1', 'w2']
D = [1,2,3,4,5,6]
我想迭代它们,以便得到最终列表
final = [ [' w1', 1], ['w2', 2], ['w1', 3], ['w2', 4], ['w1', 5], ['w2', 6]]
(按相同顺序)
我试图迭代W
和D
for i in W:
for j in D:
if j % 2 == 1 and i == 'w1' :
final. append ([i, j]
我的逻辑是除以%2来查找它是奇数还是偶数,但它不起作用。
答案 0 :(得分:5)
>>> from itertools import cycle
>>> W = ['w1', 'w2']
>>> D = [1,2,3,4,5,6]
>>> list(x for x in zip(cycle(W), D))
[('w1', 1), ('w2', 2), ('w1', 3), ('w2', 4), ('w1', 5), ('w2', 6)]
这些元素是元组,如果它真的很重要,那么我们可以添加一个阶段来将它们映射到列表。
为了解释一下,cycle
创建了传递给它的值的无限可迭代。因此,它本身会继续产生'w1','w2','w1','w2'等等。然后我们可以使用zip,将它与具有有限长度的D
组合,从而允许序列结束。
答案 1 :(得分:2)
你可以试试这个:
W = ['w1', 'w2']
D= [1,2,3,4,5,6]
new_d = [[W[0], a] if i%2 ==0 else [W[1], a] for i, a in enumerate(D)]
输出:
[['w1', 1], ['w2', 2], ['w1', 3], ['w2', 4], ['w1', 5], ['w2', 6]]
或者,对于更通用的解决方案:
new_d = [[W[i%len(W)], a] for i, a in enumerate(D)]
输出:
[['w1', 1], ['w2', 2], ['w1', 3], ['w2', 4], ['w1', 5], ['w2', 6]]
答案 2 :(得分:2)
[['w1' if i%2==1 else 'w2',i ] for i in D]
答案 3 :(得分:1)
为什么不直接使用模数?
for i, d in enumerate(D):
final.append([ W[i % len(W)], d ])
答案 4 :(得分:1)
试试这个:
W = ['w1', 'w2']
D= [1,2,3,4,5,6]
final = []
for i in range(len(D)):
if i%2 == 0:
final.append([W[0], D[i]])
else:
final.append([W[1], D[i]])
答案 5 :(得分:1)
final = [ [W[i%len(W)], x]for i,x in enumerate(D)]
输出:
[['w1', 1], ['w2', 2], ['w1', 3], ['w2', 4], ['w1', 5], ['w2', 6]]
使用我的代码: 你不需要考虑W,D的长度。它更有效率和更有效率
答案 6 :(得分:1)
你可以尝试这个解决方案:
W = ['w1', 'w2']
D= [1,2,3,4,5,6]
result = [[W[D.index(x) % len(W)], x] for x in D]
print(result)
# [['w1', 1], ['w2', 2], ['w1', 3], ['w2', 4], ['w1', 5], ['w2', 6]]
获取D
中每个元素的索引并对其进行修改。这是最直接的方法,其他答案中显示了不同的变化。
另一种方法是使用itertools.cycle()
创建一个迭代器,并使用next()
连续地在'w1'
和'w2'
之间交替:
from itertools import cycle
W = ['w1', 'w2']
D= [1,2,3,4,5,6]
iterator = cycle(W)
result = [[next(iterator), x] for x in D]
print(result)
# [['w1', 1], ['w2', 2], ['w1', 3], ['w2', 4], ['w1', 5], ['w2', 6]]
第二种方法的好处是它使用Lazy evaluation。您也不必担心任何索引,只需要担心列表本身。
答案 7 :(得分:1)
您不需要导入任何模块,这是递归方法:
W = ['w1', 'w2']
D= [1,2,3,4,5,6]
def recur(one,second):
if not second:
return 0
else:
for k in zip(second[:len(one)],one):
print(k)
return recur(one,second[len(one):])
print(recur(W,D))
输出:
(1, 'w1')
(2, 'w2')
(3, 'w1')
(4, 'w2')
(5, 'w1')
(6, 'w2')
答案 8 :(得分:1)
zip
W
的足够副本,用D
覆盖D
,解压缩到子列表
W = ['w1', 'w2', 'y~']
D= [1,2,3,4,5,6]
[[*a] for a in zip(W*(len(D)//len(W) + 1), D)]
Out[106]: [['w1', 1], ['w2', 2], ['y~', 3], ['w1', 4], ['w2', 5], ['y~', 6]]