对嵌套字典进行排序,并将序号替换为有序数字

时间:2016-08-29 07:39:36

标签: python sorting dictionary

不确定我的问题听起来有点棘手..我的要求是这样的:我在txt文件中有三列数据如下:

col1,col2,col3/n
11,0.95,21/n
11,0.75,22/n
11,0.85,23/n
11,0.65,24/n
12,0.63,22/n
12,0.75,24/n
12,0.45,25/n
...

col1可以被视为dict键,其重复<= 5次,col3也可以被视为具有col2值的嵌套dict键,即col1中的每个键具有&lt; = 5对(col2:col3)。

我想用col2对嵌套字典进行排序,并用最高排名替换col2值,即:我不关心col2中的值,我只关心每个col1值的col3排名:

col1,col2,col3
11,1,21/n
11,2,23/n
11,3,22/n
11,4,24/n
12,1,24/n
12,2,22/n
12,3,25/n
...

我尝试将数据转换为嵌套词典,如:

{col1:{col3:col2}}
{11:{21:0.95,22:0.75,23:0.85,24:0.65},12:{22:0.63,24:0.75,25:0.45}}

我已经四处寻找并找到了一些解决方案,比如排序嵌套字典等,但我无法用排名替换这些值......有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

您的输入未在此处定义,我假设为此列表。

[['col1', 'col2', 'col3'],
 ['11', '0.95', '21'],
 ['11', '0.75', '22'],
 ['11', '0.85', '23'],
 ['11', '0.65', '24'],
 ['12', '0.63', '22'],
 ['12', '0.75', '24'],
 ['12', '0.45', '25']]

然后你可以这样做,

result = {}
for i in input_list:
    if i[0] in result:
        result[i[0]].update({i[2]:i[1]})
    else:
        result[i[0]] = {i[2]:i[1]}

<强>结果

{'11': {'21': '0.95', '22': '0.75', '23': '0.85', '24': '0.65'},
'12': {'22': '0.63', '24': '0.75', '25': '0.45'},
'col1': {'col3': 'col2'}}

答案 1 :(得分:0)

嗯,这是基本Python中的一种方法:

In [90]: col1
Out[90]: [11, 11, 11, 11, 12, 12, 12]

In [91]: col2
Out[91]: [0.95, 0.75, 0.85, 0.65, 0.63, 0.75, 0.45]

In [92]: col3
Out[92]: [21, 22, 23, 24, 22, 24, 25]

让我们创建由每列中的项目组成的data

在[163]中:data = [* zip(col1,col2,col3)]

In [164]: data
Out[164]: 
[(11, 0.95, 21),
 (11, 0.75, 22),
 (11, 0.85, 23),
 (11, 0.65, 24),
 (12, 0.63, 22),
 (12, 0.75, 24),
 (12, 0.45, 25)]

让我们使用itertools模块对它们进行分组:

In [174]: import itertools

In [175]: groups = itertools.groupby(data, key=lambda x: x[0])

现在,groups是一个生成器。如果我们想看看它是什么样的 我们需要迭代它:

for a, b, in groups:
    print(a, list(b))

我们得到:

11 [(11, 0.95, 21), (11, 0.75, 22), (11, 0.85, 23), (11, 0.65, 24)]
12 [(12, 0.63, 22), (12, 0.75, 24), (12, 0.45, 25)]

但我们耗尽了迭代器。所以让我们再创造它,现在是 我们知道它包含什么,我们可以执行所需的排序:

In [177]: groups = itertools.groupby(data, key=lambda x: x[0])

In [178]: groups2 = [sorted(list(b), reverse=True) for a, b in groups]

In [179]: groups2
Out[179]: 
[[(11, 0.95, 21), (11, 0.85, 23), (11, 0.75, 22), (11, 0.65, 24)],
 [(12, 0.75, 24), (12, 0.63, 22), (12, 0.45, 25)]]

好的,还有一件事,我现在在编辑器中这样做了:

for i in range(len(groups2)):
    groups2[i] = [(x, i, z) for i, (x, y, z) in enumerate(groups2[i], 1)]

for g in groups2:
    for item in g:
        print(item)

我们得到:

(11, 1, 21)
(11, 2, 23)
(11, 3, 22)
(11, 4, 24)
(12, 1, 24)
(12, 2, 22)
(12, 3, 25)