将2个列表附加到1,每次迭代都有替换

时间:2017-12-15 02:51:31

标签: python list

我有2个列表

W = ['w1', 'w2'] 
D = [1,2,3,4,5,6]

我想迭代它们,以便得到最终列表

final = [ [' w1',  1],  ['w2', 2], ['w1', 3], ['w2', 4], ['w1', 5], ['w2', 6]]  

(按相同顺序)

我试图迭代WD

for i in W:
    for j in D:
        if j % 2 == 1 and i == 'w1' :
            final. append ([i, j] 

我的逻辑是除以%2来查找它是奇数还是偶数,但它不起作用。

9 个答案:

答案 0 :(得分:5)

使用itertools.cyclezip

>>> 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]]