如何根据 Python 中的元组内容拆分列表
How to split a list based on tuple content in Python
我有一个三元组列表,我想在最后一个坐标上拆分它们。例如,如果输入是:
[(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 个不同的第 3 个索引并遍历列表 N 次以构建列表列表。我想知道是否有一种 pythonic 方法可以在不循环多次的情况下执行此操作。
你可以这样做:
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))
嵌套列表理解
如果你不知道 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]
这是一种复杂度为 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')]]
与@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')]]
我有一个三元组列表,我想在最后一个坐标上拆分它们。例如,如果输入是:
[(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 个不同的第 3 个索引并遍历列表 N 次以构建列表列表。我想知道是否有一种 pythonic 方法可以在不循环多次的情况下执行此操作。
你可以这样做:
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))
嵌套列表理解
如果你不知道 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]
这是一种复杂度为 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')]]
与@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')]]