我有两个列表,第一个列表保证只包含一个列表而不是第二个列表.我想知道创建一个新列表的最Pythonic方法,其中偶数索引值来自第一个列表,其奇数索引值来自第二个列表.
# example inputs
list1 = ['f', 'o', 'o']
list2 = ['hello', 'world']
# desired output
['f', 'hello', 'o', 'world', 'o']
Run Code Online (Sandbox Code Playgroud)
这有效,但并不漂亮:
list3 = []
while True:
try:
list3.append(list1.pop(0))
list3.append(list2.pop(0))
except IndexError:
break
Run Code Online (Sandbox Code Playgroud)
如何实现这一目标呢?什么是最Pythonic方法?
Dun*_*can 93
这是切片的一种方法:
>>> list1 = ['f', 'o', 'o']
>>> list2 = ['hello', 'world']
>>> result = [None]*(len(list1)+len(list2))
>>> result[::2] = list1
>>> result[1::2] = list2
>>> result
['f', 'hello', 'o', 'world', 'o']
Run Code Online (Sandbox Code Playgroud)
Dav*_*d Z 47
itertools文档中有一个配方:
from itertools import cycle, islice
def roundrobin(*iterables):
"roundrobin('ABC', 'D', 'EF') --> A D E B F C"
# Recipe credited to George Sakkis
pending = len(iterables)
nexts = cycle(iter(it).next for it in iterables)
while pending:
try:
for next in nexts:
yield next()
except StopIteration:
pending -= 1
nexts = cycle(islice(nexts, pending))
Run Code Online (Sandbox Code Playgroud)
Mar*_*ers 27
这应该做你想要的:
>>> iters = [iter(list1), iter(list2)]
>>> print list(it.next() for it in itertools.cycle(iters))
['f', 'hello', 'o', 'world', 'o']
Run Code Online (Sandbox Code Playgroud)
use*_*640 25
import itertools
print [x for x in itertools.chain.from_iterable(itertools.izip_longest(list1,list2)) if x]
Run Code Online (Sandbox Code Playgroud)
我认为这是做到这一点的最蟒蛇的方式.
Zar*_*art 14
没有itertools并假设l1比l2长1项:
>>> sum(zip(l1, l2+[0]), ())[:-1]
('f', 'hello', 'o', 'world', 'o')
Run Code Online (Sandbox Code Playgroud)
使用itertools并假设列表不包含None:
>>> filter(None, sum(itertools.izip_longest(l1, l2), ()))
('f', 'hello', 'o', 'world', 'o')
Run Code Online (Sandbox Code Playgroud)
Arc*_*ast 12
如果两个列表的长度相等,您可以执行以下操作:
[x for y in zip(list1, list2) for x in y]
Run Code Online (Sandbox Code Playgroud)
由于第一个列表还有一个元素,您可以事后添加它:
[x for y in zip(list1, list2) for x in y] + [list1[-1]]
Run Code Online (Sandbox Code Playgroud)
mho*_*ost 10
我知道问题是关于两个列表,其中一个项目比另一个项目更多,但我想我会把它放在可能找到这个问题的其他人的名单上.
这是Duncan的解决方案,适用于两个不同大小的列表.
list1 = ['f', 'o', 'o', 'b', 'a', 'r']
list2 = ['hello', 'world']
num = min(len(list1), len(list2))
result = [None]*(num*2)
result[::2] = list1[:num]
result[1::2] = list2[:num]
result.extend(list1[num:])
result.extend(list2[num:])
result
Run Code Online (Sandbox Code Playgroud)
这输出:
['f', 'hello', 'o', 'world', 'o', 'b', 'a', 'r']
Run Code Online (Sandbox Code Playgroud)
这是一个这样做的班轮:
list3 = [ item for pair in zip(list1, list2 + [0]) for item in pair][:-1]
| 归档时间: |
|
| 查看次数: |
54828 次 |
| 最近记录: |