Py学习  »  Python

如何在Python中基于元组内容拆分列表

GTOgod • 3 年前 • 1406 次点击  

我有一个三元组的列表,我想在最后一个坐标上拆分它们。例如,如果输入是:

[(1,2,x)、(2,3,x)、(1,2,z)、(2,20,z)]

我希望输出是

[(1,2,x),(2,3,x)],[(1,2,z),(2,20,z)]

我目前的方法是获取所有N个不同的第三个索引,并在列表上循环N次以构建列表列表。我想知道是否有一种类似蟒蛇的方法可以做到这一点,而不需要多次循环。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/129389
 
1406 次点击  
文章 [ 4 ]  |  最新文章 3 年前
Jhanzaib Humayun
Reply   •   1 楼
Jhanzaib Humayun    3 年前

你可以这样做:

my_list = [(1,2,x), (2,3,x), (1,2,z), (2,20,z)]

list_x = [item for item in my_list if item[2] == x]
list_y = [item for item in my_list if item[2] == y]
list_z = [item for item in my_list if item[2] == z]

编辑:如果x、y和z不是数字,那么这应该可以:

my_list = [(1,2,'x'), (2,3,'x'), (1,2,'z'), (2,20,'z')]

list_x = [item for item in my_list if item[2] == 'x']
list_y = [item for item in my_list if item[2] == 'y']
list_z = [item for item in my_list if item[2] == 'z']

如果你想让他们在同一个列表中,那么就这样做

final_list = list((list_x,list_z))
Mark
Reply   •   2 楼
Mark    3 年前

类似于@eshirvana,但使用defaultdict,这对于此类问题来说非常有效且常见。我会制作一个defaultdict,并根据最后一个元素确定的键保存元组列表。然后你们所有的小组都会在 values()

from collections import defaultdict

l = [(1,2,'x'), (2,3,'x'), (1,2,'z'), (2,20,'z'), (3,4,'x')]

groups = defaultdict(list)

for t in l:
    groups[t[-1]].append(t)
    
list(groups.values())
# [[(1, 2, 'x'), (2, 3, 'x'), (3, 4, 'x')], [(1, 2, 'z'), (2, 20, 'z')]]
konstanze
Reply   •   3 楼
konstanze    3 年前

嵌套列表理解 如果你不知道 third_indices 先验:

my_list = [(1,2,'x'), (2,3,'x'), (1,2,'z'), (2,20,'z')]
third_indices = set([ix[-1] for ix in my_list])
[[item for item in my_list if item[-1]==ix] for ix in third_indices]
eshirvana
Reply   •   4 楼
eshirvana    3 年前

这里有一种方法可以解释O(n)的复杂性:

lt = [(1,2,'x'), (2,3,'x'), (1,2,'z'), (2,20,'z')]

res = {}
for i in lt:
  res.setdefault(i[2], []).append(i)

print(list(res.values()))

输出:

>>>
[[(1, 2, 'x'), (2, 3, 'x')], [(1, 2, 'z'), (2, 20, 'z')]]