繁体   English   中英

保留 python 中元组列表中的唯一组合

[英]retain unique combinations from a list of tuples in python

我有一个包含 int 和 str 值的元组列表:

Listex:
[23,'item1','item2']
[23,'item2','item1']
[67,'item3','item2']
[55,'item3','item4']
[67,'item2','item3']
[55,'item4','item3']

我需要的是获得唯一的元组:

Listex output:
[23,'item1','item2']
[67,'item2','item3']
[55,'item3','item4']

我已经尝试过 sort(),但我得到了 '<' 不能与 str 和 int 一起使用的错误。 感谢这方面的任何帮助。 先感谢您。

首先使用frozenset以便比较不会考虑字符串的顺序,然后使用set删除重复项,最后转换回列表列表:

In [1]: data = [[23,'item1','item2'], 
   ...: [23,'item2','item1'], 
   ...: [67,'item3','item2'], 
   ...: [55,'item3','item4'], 
   ...: [67,'item2','item3'], 
   ...: [55,'item4','item3']]                                                                                                                                                                                                                                                            

In [2]: list(map(list, set(map(frozenset, data))))                                                                                                                                                                                                                                       
Out[2]: [[67, 'item2', 'item3'], ['item1', 'item2', 23], ['item3', 'item4', 55]]

您不能直接将set应用于原始集合,因为set要求其元素是hashable ,而list不是。 将内部列表转换为frozenset使它们可散列,并具有与顺序无关的额外好处。 使用tuple将使元素可散列,但元素的顺序很重要。

根据您要对数据执行的操作,您可以简单地使用一组冻结集并完全避免使用列表:

In [3]: set(map(frozenset, data))                                                                                                                                                                                                                                                        
Out[3]: 
{frozenset({67, 'item2', 'item3'}),
 frozenset({23, 'item1', 'item2'}),
 frozenset({55, 'item3', 'item4'})}

如果您想将数字保留为第一个元素,您可以用一些 function 替换list ,例如:

In [5]: def keep_number_first(seq): 
   ...:     return sorted(seq, key=lambda x: 1 if not isinstance(x, (int, float)) else 0) 
   ...:           

按类型排序:

In [6]: list(map(keep_number_first, set(map(frozenset, data))))                                                                                                                                                                                                                          
Out[6]: [[67, 'item2', 'item3'], [23, 'item1', 'item2'], [55, 'item3', 'item4']]

这就是说:如果您必须以这种方式保持数据结构,恕我直言,最好想出自己的namedtuple或使用命名元组并为不同的部分赋予一些含义。 例如,不使用[23, 'item1', 'item2']为什么不使用(23, ['item1', 'item2'])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM