0

我有一个包含数字平均位置计算的 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 循环的情况下提取它们的任何好方法。

在python中有什么简单而好的方法吗?

4

2 回答 2

8

如果您的 dict 是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 程序中_没有什么特别之处。)_

于 2012-11-07T20:22:41.957 回答
6
In [36]: ''.join([key for key, val in sorted(data, key = lambda item: item[1])])
Out[36]: '73162890'

解释:

这将根据 中每个项目的第二个值对数据进行排序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)]

现在我们可以使用列表推导收集每个项目中的第一个值:

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

并使用''.join以下方法将这些项目连接成一个字符串:

In [39]: ''.join([key for key, val in sorted(data, key = lambda item: item[1])])
Out[39]: '73162890'
于 2012-11-07T20:22:39.957 回答