Python 3.2中的大括号集合与排序
你好,我有两个问题:
我想要创建一组二元组,比如说像这样:
new = [{24,33},{12,13},{17,19},....]
。基本上,我有两个列表,一个叫做N = [24,12,17,....]
,另一个是z = [33,13,19,....]
。我一直在尝试用以下方法来实现:new=[] for i in range(len(z)): new.append({z[i]}) new.extend({N[i]}) print(new)
我尝试了很多种用append和extend的方法,有的用大括号,有的不用。
一旦完成了第一个问题,我想根据每组中第二个元素的大小来重新排列
new
,也就是按照z
的升序排列,所以我想得到:new=[{12,13},{17,19},{24,33}]
4 个回答
1
>>> list(map(set, zip(N, z))) [{24, 33}, {12, 13}, {17, 19}]
我想根据第二个元素的大小来重新排列新的内容。
集合是无序的,所以没有所谓的“第二个元素”。
如果你需要保持两个元素的顺序,可能应该使用元组而不是集合。
要根据第二个元素的大小来重新排列元组:
>>> sorted(zip(N, z) , key=lambda x:x[1])
[(12, 13), (17, 19), (24, 33)]
2
第一个很简单:
new = [set(x) for x in zip(N,z)]
第二个实际上需要在创建集合之前完成,因为集合是没有顺序的:
new = [set(x) for x in sorted(zip(N,z),key=lambda x:x[1])]
或者
import operator
new = [set(x) for x in sorted(zip(N,z),key=operator.itemgetter(1))]
对于那些不喜欢 lambda
的人
其实你是否真的想用 sets
还不太确定。我觉得用 tuple
可能更好——在这种情况下,只需要使用 sorted
步骤。
new = sorted(zip(N,z),key=lambda x:x[1])
集合不保持任何顺序,也不能通过索引访问,所以它们并不是存储 x-y
对的好数据结构,因为你无法知道哪个元素是 x
,哪个元素是 y
。
3
使用 zip()
可以把两个列表配对起来:
new = [{a, b} for a, b in zip(N, z)]
但是集合是 无序的,所以没有“第二个值”。你可以尝试根据最小值来排序:
new.sort(key=lambda s: min(s))
如果你需要根据 z
的值来排序,最好在创建集合之前就先排序:
from operator import itemgetter
new = [{a, b} for a, b in sorted(zip(N, z), key=itemgetter(1))]
但是如果这些真的是 x 和 y 坐标,那就直接用 zip()
和 sorted()
来生成一系列的 元组:
new = sorted(zip(N, z), key=itemgetter(1))
set()
只包含唯一的值:
>>> {1, 1}
set([1])
而元组是一个有序(不可改变)的序列:
>>> (1, 1)
(1, 1)