簡體   English   中英

從元組更改為列表,反之亦然

[英]changing from tuple to list and vice versa

我怎么能把[('a', 1), ('c', 3), ('b', 2)]改為['a',1,'c',3,'b',2]和反之亦然? 謝謝

[('a', 1), ('c', 3), ('b', 2)]['a',1,'c',3,'b',2]壓扁的列表 從那里接受接受的答案並修改此示例:

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

這是我的看法(假設包含第一個列表,第二個列表):

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

這里已經有很多正確的答案了,所以這只是提醒我們不要使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM