我有一个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中有没有简单而好的方法呢?
答案 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'