【问题标题】:Sort nested dictionaries and replace dictioary values with ordered numbers对嵌套字典进行排序并用有序数字替换字典值
【发布时间】:2016-08-29 07:39:35
【问题描述】:

不确定我的问题是否听起来有点棘手..我的要求是这样的:我在 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 可以被视为重复

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

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}}

我已经四处搜索并找到了一些解决方案,如 sort nested dict 等,但我也无法用排名替换这些值...有人可以帮忙吗?

【问题讨论】:

  • 尝试使用 pandas(将文件作为数据框读取并使用第二列排序)。

标签: python sorting dictionary


【解决方案1】:

嗯,这是一种在基本 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] 中:数据 = [*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)

【讨论】:

  • 非常感谢@Israel Unterman。我担心我没有明确定义我的问题(可能是的,因为很明显有些人被我弄糊涂了——为此道歉)。但是你的方法正好解决了我的问题。我现在可以用你的方法解决我的问题了!
【解决方案2】:

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

[['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'}}

【讨论】:

  • 这种方法不允许将 col2 值替换为它们的排名,但字典创建很好。
  • @Ev.Kounis 实际上我为键和值分配了错误的值。现已修复。
  • Python 字典没有 has_key 方法
  • @juanpa.arrivillaga 它已经阅读了这个tutorialspoint.com/python/dictionary_has_key.htm
  • 抱歉,这只适用于 Python 3。
猜你喜欢
  • 2021-05-31
  • 2014-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-08
  • 2020-11-11
  • 1970-01-01
相关资源
最近更新 更多