从元组列表中选出2个项目

3

我有一个元组列表:

Items = [(4, 2), (1, 1), (2, 4), (8, 6), (11, 4), (10, 2), (7, 3), (6, 1)]

我想在 for 循环中这样获取它:

NewItems = [[(4, 2), (1, 1)], 
            [(2, 4), (8, 6)],
            [(11, 4), (10, 2)],
            [(7, 3), (6, 1)]]

我做了这个:

NewItems = []
while len(Items) > 0:
    NewItems.append([Items[0], Items[1]])
    del Items[0:2]
print NewItems

我认为删除Items变量并不是最好的方法。然后我尝试做了这个:

newList = iter(Items)
NewItems = []
for a, b in zip(newList, newList):
    NewItems.append([a, b])
print NewItems

但这是合并元组的方法。

有没有更好的解决方案可以达到相同的效果?


1
你可以像这样创建元组列表:zip(Items, Items[1:]) - Dharmik
迭代版本有什么问题吗?它似乎生成了所需的输出。显然,您不需要显式的for循环,只需要一个列表推导式NewItems = [list(x) for x in zip(newList, newList)]。如果您不介意使用元组而不是列表,那么更简单:NewItems = list(zip(newList, newList))。迭代版本避免了创建任何中间列表-因此是我首选的方法。 - AChampion
@AChampion 是的,那是我的错误,我应该只使用循环中的一个变量并将其附加为列表。 - Bear
6个回答

4
如果你不介意使用元组嵌套元组而不是内部列表,那就将它们合并起来:
>>> zip(Items[0::2], Items[1::2])
[((4, 2), (1, 1)), ((2, 4), (8, 6)), ((11, 4), (10, 2)), ((7, 3), (6, 1))]

请注意,这两个函数在Python 3中都不会返回一个list。虽然OP使用的是Python 2.7,所以这不是问题,但是list(zip(...))是可移植的。 - AChampion

3

您可以使用列表推导式,其中将项目成对压缩。

Items = [(4, 2), (1, 1), (2, 4), (8, 6), (11, 4), (10, 2), (7, 3), (6, 1)]
New_Items = [list(pair) for pair in zip(Items[::2], Items[1::2])]

>>> New_Items
[[(4, 2), (1, 1)], [(2, 4), (8, 6)], [(11, 4), (10, 2)], [(7, 3), (6, 1)]]

2
>>> items = [(4,2),(1,1),(2,4),(8,6),(11,4),(10,2),(7,3),(6,1)]
>>> new_items = [items[i:i+2] for i in range(0, len(items), 2)] 
>>> new_items
[[(4, 2), (1, 1)], [(2, 4), (8, 6)], [(11, 4), (10, 2)], [(7, 3), (6, 1)]]

您可以使用while循环来实现,像这样。
>>> new_items = []
>>> while items:
...     new_items.append((items.pop(0), items.pop(0)))
... 
>>> new_items
[((4, 2), (1, 1)), ((2, 4), (8, 6)), ((11, 4), (10, 2)), ((7, 3), (6, 1))]

然而,这种方法对于items来说是具有破坏性的,并且由于使用了O(n)的pop(0)操作,效率不高。


2
怎么样?
Items = [(4,2),(1,1),(2,4),(8,6),(11,4),(10,2),(7,3),(6,1)]

NewItems = []
j =0   
for i in xrange(1,len(Items)-1): 
    if j+1 > len(Items):
        break
    NewItems.append([Items[j],Items[j+1]])
    j += 2

print NewItems

这仍然给出了错误的结果。[[(1, 1), (2, 4)], [(2, 4), (8, 6)], [(8, 6), (11, 4)]] - Alexander
[[(4, 2), (1, 1)], [(2, 4), (8, 6)], [(11, 4), (10, 2)], [(7, 3), (6, 1)]] [[(4, 2), (1, 1)], [(2, 4), (8, 6)], [(11, 4), (10, 2)], [(7, 3), (6, 1)]] - yael

1
from time import time

Items = [(4,2),(1,1),(2,4),(8,6),(11,4),(10,2),(7,3),(6,1)]
NewItems = []
start_time = time()
while len(Items) > 0 :
    NewItems.append([Items[0],Items[1]])
    del Items[0:2]
print NewItems
print time() - start_time

Items = [(4,2),(1,1),(2,4),(8,6),(11,4),(10,2),(7,3),(6,1)]
NewItems = []
start_time = time()
for i in range(len(Items) / 2):
    NewItems.append([Items[2*i],Items[2*i + 1]])
print NewItems
print time() - start_time

为了验证第二种解决方案更快,需要一些时间控制。


0

另一种方法,但可能不是最漂亮的。

x = []
i = iter(Items)

while True:
    try:
        x.append([i.next(), i.next()])
    except StopIteration:
        break

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接