Collect every pair of elements from a list into tuples in Python
Possible Duplicate:
Pairs from single list
我有一个小整数列表,比如:
我希望收集顺序对并返回一个包含从这些对创建的元组的新列表,即:
1
| [(1, 2), (3, 4), (5, 6)] |
我知道必须有一个非常简单的方法来做这件事,但不能完全解决。
谢谢
- 这是作业吗?如果是,请使用[家庭作业]标签。
- 从单个列表和许多其他列表中可能复制对。
- @洛特,为什么会是家庭作业?从你的经验来看是这样吗?
- 不是家庭作业,个人兴趣
- @s.lott用于对从不同程序传递的预先存在的数据进行旁侧处理。
- @Tartanllama:"从不同程序传递的预先存在的数据"?也许你应该问你真正的问题。听起来其他程序可能有设计问题,或者输入解析器可能有一个小的设计问题。像这样创建一个简单的列表并将其重新格式化为成对是不理想的。可能有办法避免所有这些。
- @洛特:很明显,我要做些改变,这更是出于兴趣,因为我意识到我不知道如何执行这项任务。
- N-duplicate:只需快速搜索:stackoverflow.com/questions/4501636、stackoverflow.com/questions/312443、stackoverflow.com/questions/4170295、stackoverflow.com/questions/434287
- 我不知道在这种情况下"不切实际"是什么意思。软件挑战往往是数据形状不实用的结果。考虑一种旧的方法来组织由于新的业务需求而必须更改的数据。像"不切实际"这样的判断充满了假设和猜测。
- @杰德尔:不是真的。在读取输入时,它总是可以成对构建的。阅读一个简单的列表和重组列表总是可以避免的。这不是"猜测"。改变软件设计来直接组装所需的数据结构是一个问题。如果可以分两步进行组装,则可以对其进行重构,以便在一个步骤中进行组装。
- @S.lott:我要说的是,在某一点上,将该输入作为一个列表,并且仍然需要它,因为该列表是一种可能由于业务逻辑和需求而变得必要的情况。在一个新版本中,一个需要采用新格式的实例现在可能已经存在,并且已经拥有了列表。我要说的是,实用性或不实用性是由业务需求和程序的行为定义的。我的意见是你没有足够的信息打电话。我不是说这是攻击。你只是没有完整的背景。
- @Jaydel:如果它可以分两步组装,就可以重构,这样组装就只需要一步。这与"业务需求"无关。这是设计问题。任何效率低下的两步流程都可以重构为效率更高的一步流程。我知道简单列表可能有一些价值,但是"从不同程序传递的预先存在的数据"的注释似乎表明简单列表没有其他用途。是的,我可能错了。然而,修复设计可能比这个问题的答案更有效。
- 我会买的。我认为最初让我感到意外的是,我很难断言这是不切实际的。我在心理上加上了"似乎"甚至"可能是",感觉好多了。
- @贾德尔:考虑到这一评论("从不同程序传递的预先存在的数据"),设计似乎完全不切实际。评论仍然有可能不正确或不完整。
好吧,有一个非常简单,但有点脆弱的方法,把它自己的切片版本。
1
| zipped = zip(mylist[0::2], mylist[1::2]) |
如果您不知道,最后一个slice参数是"step"。所以我们从零(1,3,5)开始选择列表中的每一个第二项。然后我们做同样的事情,但是从一个(2,4,6)开始,用zip从它们中创建元组。
- 为什么这个易碎?
- 元素的奇数可能会产生令人惊讶的结果。此外,零长度列表的行为也会很糟糕。
- 脆弱性的解决方案可以是这样的小调整(如果您不介意在元素是奇数时使用空字符串)if len(mylist)%2 !=0: mylist.append('') ; zip(mylist[0::2], mylist[1::2])。
直接从itertools模块的python文档中:
1 2 3 4 5 6 7 8 9 10 11
| from itertools import tee, izip
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = tee(iterable)
next(b, None)
return izip(a, b)
l = [1, 2, 3, 4, 5, 6]
for pair in pairwise(l):
print pair |
- + 1。是的,有一种更有力的方法:d
- 这并不能完全满足OP的要求——它打印的是(1, 2), (2, 3), (3, 4), (4, 5), (5, 6),而不是(1, 2), (3, 4), (5, 6)。
- 右边的函数是grouper,就在itertools食谱中这个函数的正下方;)
除了以上的答案,你还需要知道最简单的方法(如果你还不知道的话)
1 2
| l = [1, 2, 3, 4, 5, 6]
o = [(l[i],l[i+1]) for i in range(0,len(l),2)] |
- 我完全忘记了可选的步进参数到范围
- 为什么从长度上减去2?这是错误的。
- 这将自动删除奇数长度列表的最后一个元素。这合适吗?还是应该引起某种例外?
- @洛特:这类问题通常只处理偶数长度的列表。
- 这肯定不起作用,将引发列表索引超出范围异常。