2017-01-30 79 views
-1

我想对列表进行排序。如何通过内部列表的排序索引对字符列表进行排序?

这里是列表的我的输入列表:

[('H', 'A'), ('H', 'C'), ('H', 'K'), ('A', 'C'), ('A', 'K'), ('C', 'K')] 

而且我所要的输出是这样

[('A', 'C'), ('A', 'H'), ('A', 'K'), ('C', 'H'), ('C', 'K'), ('H', 'K')] 
+0

啊,你的意思是你要包含的元组也进行排序? –

+0

你确定这是列表列表的语法吗? – kouty

+0

输出显示内部元组也需要排序。 –

回答

3

你的输出表明需要在元组和最后的两个元素进行排序名单。所以只是做:

l = [('H', 'A'), ('H', 'C'), ('H', 'K'), ('A', 'C'), ('A', 'K'), ('C', 'K')] 

print(sorted([tuple(sorted(x)) for x in l])) 

结果:

[('A', 'C'), ('A', 'H'), ('A', 'K'), ('C', 'H'), ('C', 'K'), ('H', 'K')] 

这个重建与你的元组列表,现在排序内,并执行对这些元组sort

+0

嗯,我以为你使用了一个列表理解,很高兴,现在我看到你使用了一个生成器表达式,现在我不开心...... :-)对于某些操作,列表理解将会快得多,因为结果被转换为无论如何,一个列表。除'str.join'之外的'sorted'就是其中之一。如果你想得到更快:'sort(map(iteration_utilities.chained(sorted,tuple),lst))''(需要一个[外部库](http://iteration-utilities.readthedocs.io/en/latest/ api/cfuncs.html#iteration_utilities.chained),但仅仅意味着一个“不错的信息”:D) – MSeifert

+1

噢,right:'sorted'需要一次完整列表!将修复!我自己评论所有使用'str.join'的帖子。我无法习惯这个双括号的东西。有一天必须要做某件事。由于'map'返回一个迭代器,所以''你的排序(映射)'解决方案也需要重建列表。 –

+0

但是'iteration_utilities.chained(sorted,tuple)'不需要经过任何python层,因为所有3个函数在C中实现。这提供了比一个输入更多的加速。 – MSeifert

0

你可以尝试这样的事:

data=[('H', 'A'), ('H', 'C'), ('H', 'K'), ('A', 'C'), ('A', 'K'), ('C', 'K')] 


print(sorted(list(map(lambda i:(i[0],i[1]) if i[0]<i[1] else (i[1],i[0]),data)))) 

输出:

[('A', 'C'), ('A', 'H'), ('A', 'K'), ('C', 'H'), ('C', 'K'), ('H', 'K')]