从元组更改为列表,反之亦然

时间:2011-01-25 22:54:52

标签: python list

我怎样才能将[('a', 1), ('c', 3), ('b', 2)]更改为['a',1,'c',3,'b',2],反之亦然? 感谢

4 个答案:

答案 0 :(得分:10)

[('a', 1), ('c', 3), ('b', 2)]['a',1,'c',3,'b',2]的第一个方向是flattening a list。从那里接受接受的答案并修改这个例子:

>>> L = [('a', 1), ('c', 3), ('b', 2)]
>>> list(itertools.chain(*L))
['a', 1, 'c', 3, 'b', 2]

这使用itertools.chain这是itertools的一个很好的工具,可以很好地展平序列。

采取相反的方式是拉链:

>>> L = ['a', 1, 'c', 3, 'b', 2]
>>> zip(L[0::2], L[1::2])
[('a', 1), ('c', 3), ('b', 2)]

zip获取两个列表,并将列表1的第一个元素与列表2中元组的第一个元素组合在一起,依此类推列表的长度。所以在这一个中,我们基本上将偶数索引元素作为我们的第一个列表(L[0::2]),然后将奇数索引元素作为我们的第二个(L[1::2]

答案 1 :(得分:3)

这是我对它的看法(假设包含第一个列表和b秒):

b = []
for i in a:
    b.extend(i)

反过来:

c = []
for i in range(0, len(b) - 1, 2):
   c.append((b[i], b[i+1]))

答案 2 :(得分:1)

L = [('a', 1), ('c', 3), ('b', 2)]
flat = [x for p in L for x in p]
assert flat == ['a', 1, 'c', 3, 'b', 2]

it = iter(flat)
L2 = zip(it, it)
assert L2 == L

print "Success"

答案 3 :(得分:1)

这里已经有很多正确答案了,所以这只是提醒 使用sum()来展平列表,尽管它看起来像一个简洁的解决方案<强>不幸的是表现是二次的

In [1]: L=[('a',x) for x in range(10)]

In [2]: timeit sum(L,())
100000 loops, best of 3: 2.78 us per loop

In [3]: L=[('a',x) for x in range(100)]

In [4]: timeit sum(L,())
10000 loops, best of 3: 108 us per loop

In [5]: L=[('a',x) for x in range(1000)]

In [6]: timeit sum(L,())
100 loops, best of 3: 8.02 ms per loop
相关问题