Python 3.2中的大括号集合与排序

1 投票
4 回答
714 浏览
提问于 2025-04-17 18:16

你好,我有两个问题:

  1. 我想要创建一组二元组,比如说像这样: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的方法,有的用大括号,有的不用。

  2. 一旦完成了第一个问题,我想根据每组中第二个元素的大小来重新排列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)

撰写回答