1

您好我有两个问题:

  1. 我正在尝试使用表单示例的 ie 构建两个组: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)
    

    并且已经尝试了带有或不带有大括号的附加和扩展的许多变体。

  2. 一旦 1) 实现,我想根据每组中第二个项目的大小重新排列新的,即按 z 的升序排列,所以我想得到:

    new=[{12,13},{17,19},{24,33}]
    
4

4 回答 4

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()andsorted()给你一个元组序列:

new = sorted(zip(N, z), key=itemgetter(1))

Aset()仅包含唯一值:

>>> {1, 1}
set([1])

元组是一个有序的(不可变的)序列:

>>> (1, 1)
(1, 1)
于 2013-03-07T13:53:38.740 回答
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它。我认为 atuple可能会更好——在这种情况下,只需使用该sorted步骤。

new = sorted(zip(N,z),key=lambda x:x[1])

集合不维护任何顺序并且不可索引,因此它们不能构成一个非常好的数据结构来保存x-y对,因为您无法知道哪个元素是x哪个元素是y

于 2013-03-07T13:53:47.880 回答
1

您不想要集合(其中两个值必须不同,并且没有顺序),而是元组 - 只是两个项目一个接一个地出现。

使用zip函数和sorted排序:

>>> z = [24, 12, 17]
>>> N = [33, 13, 19]
>>> sorted(zip(z, N), key=lambda tpl: tpl[1])
[(12, 13), (17, 19), (24, 33)]
于 2013-03-07T13:57:37.520 回答
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)]
于 2013-03-07T13:55:30.500 回答