不确定我的问题听起来有点棘手..我的要求是这样的:我在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}}
我已经四处寻找并找到了一些解决方案,比如排序嵌套字典等,但我无法用排名替换这些值......有人可以帮忙吗?
答案 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)