从defaultdict中提取信息

时间:2012-11-07 20:14:46

标签: python defaultdict

我有一个defaultdict,其中包含数字平均位置的计算(欧拉问题)

[('1', 0.6923076923076923), ('0', 2.0), ('3', 0.2222222222222222),
 ('2', 1.0909090909090908), ('7', 0.0), ('6', 0.875), 
('9', 1.6923076923076923),('8', 1.3333333333333333)]

我正在尝试将此信息转换为简单的字符串,而不是从0 - 2手动执行。 我正在寻找的最终结果是

73162890

我不知道在不使用许多if-else和for-loops的情况下提取它们的任何好方法。

在python中有没有简单而好的方法呢?

2 个答案:

答案 0 :(得分:8)

如果您的字典是d,那么items = d.items()会为您提供一对配对列表,就像您一样。获得此列表后,您可以按第二个元素对其进行排序:

ordered = sorted(items, key=lambda (_, value): value) # Not Python 3

# or,
ordered = sorted(items, key=lambda x: x[1])

# or,
import operator
ordered = sorted(items, key=operator.itemgetter(1))

一旦我们按排序顺序列出了列表,我们只需从每个列表中提取字符串,然后将它们粘合在一起:

result = ''.join(string for (string, _) in ordered)

(请注意,我正在调用未使用的参数_,Python程序中的_并没有什么特别之处。)

答案 1 :(得分:6)

In [36]: ''.join([key for key, val in sorted(data, key = lambda item: item[1])])
Out[36]: '73162890'

说明:

This sorts the data根据data中每个项目的第二个值。

In [37]: sorted(data, key = lambda item: item[1])
Out[37]: 
[('7', 0.0),
 ('3', 0.2222222222222222),
 ('1', 0.6923076923076923),
 ('6', 0.875),
 ('2', 1.0909090909090908),
 ('8', 1.3333333333333333),
 ('9', 1.6923076923076923),
 ('0', 2.0)]

现在我们可以使用list comprehension收集每个项目中的第一个值:

In [38]: [key for key, val in sorted(data, key = lambda item: item[1])]
Out[38]: ['7', '3', '1', '6', '2', '8', '9', '0']

将这些项目加入字符串using ''.join

In [39]: ''.join([key for key, val in sorted(data, key = lambda item: item[1])])
Out[39]: '73162890'