【问题标题】:how to interleaving lists [duplicate]如何交错列表[重复]
【发布时间】:2013-11-22 09:22:29
【问题描述】:

我有两个长度可能不相等的列表,我希望能够将它们交错。我希望能够在交错列表末尾的较长列表中附加额外的值。我有这个:

def interleave(xs,ys):
a=xs
b=ys
minlength=[len(a),len(b)]
extralist= list()
interleave= list()
for i in range((minval(minlength))):
    pair=a[i],b[i]
    interleave.append(pair)
    flat=flatten(interleave)
    c=a+b
if len(b)>len(a):
    remainder=len(b)-len(a)
    print(remainder)
    for j in range(remainder,-1,-1):
        extra=b[-j]
        extralist.append(extra)
        print(extralist)
if len(a)>len(b):
    remainder=len(a)-len(b)
    print(remainder)
    for j in range(remainder,-1,-1):
        extra=a[-j]
        extralist.append(extra)
final=flat+extralist
return final

但如果我测试它:

>>> interleave([1,2,3], ["hi", "bye",True, False, 33])
[1, 'hi', 2, 'bye', 3, True]
>>> 

False 和 33 不会出现。我到底做错了什么?

编辑:我找到了解决方案。我向后索引:)

【问题讨论】:

  • @Marcin 我希望能够使用 for 循环和 if else 语句来做到这一点。
  • 也许你不应该这样。
  • @Marcin 我定义了一个 zip 函数,可以压缩它们,但它不会压缩其余元素。

标签: python for-loop python-3.x user-defined-functions


【解决方案1】:

这是使用itertools.zip_longestlist comprehension 的解决方案:

>>> from itertools import zip_longest
>>> a = [1, 2, 3]
>>> b = ["hi", "bye", True, False, 33]
>>> [y for x in zip_longest(a, b) for y in x]
[1, 'hi', 2, 'bye', 3, True, None, False, None, 33]
>>> [y for x in zip_longest(a, b) for y in x if y is not None]
[1, 'hi', 2, 'bye', 3, True, False, 33]
>>>

编辑:

如果你不想使用itertools,我想你可以这样做:

>>> a = [1, 2, 3]
>>> b = ["hi", "bye", True, False, 33]
>>> items = sorted((a,b), key=len)
>>> out = []
>>> for x,y in enumerate(items[1]):
...     out.append(y)
...     try:
...         out.append(items[0][x])
...     except IndexError:
...         out.extend(items[1][x+1:])
...         break
...
>>> out
['hi', 1, 'bye', 2, True, 3, False, 33]
>>>

但我必须说这种方法不如我的第一个解决方案有效。


编辑 2:

enumerate 更改为zip 再次降低了效率。但是,如果您必须,那么您可以这样做:

>>> a = [1, 2, 3]
>>> b = ["hi", "bye", True, False, 33]
>>> out = []
>>> items = sorted((a,b), key=len)
>>> for x,y in zip(range(len(items[1])), items[1]):
...     out.append(y)
...     try:
...         out.append(items[0][x])
...     except IndexError:
...         out.extend(items[1][x+1:])
...         break
...
>>> out
['hi', 1, 'bye', 2, True, 3, False, 33]
>>>

【讨论】:

  • 有没有办法以最简单的形式做到这一点?
  • @user2829177 - “最简单的形式”是什么意思?我的解决方案小而高效。另外,itertools 是一个标准库,所以它会一直存在。
  • 我不想使用任何我还不知道的功能
  • @user2829177 - 好吧,看看我的编辑。也许这就是你想要的。
  • 嘿。每个人都在重新发明我们提出的last times OP 提出的解决方案之一。
【解决方案2】:

另一种选择

from itertools import chain
x = [1, 2, 3]
y = iter(["hi", "bye",True, False, 33])
list(chain.from_iterable(zip(x, y))) + list(y)
[1, 'hi', 2, 'bye', 3, True, False, 33]

【讨论】:

    猜你喜欢
    • 2012-06-22
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 2018-11-21
    • 1970-01-01
    • 2013-01-14
    相关资源
    最近更新 更多