【问题标题】:How to Add Tuples of Two into a Dictionary?如何将两个元组添加到字典中?
【发布时间】:2016-12-02 13:15:47
【问题描述】:

我有两个列表:

list1 = ['USD', 'GBP', 'CHF', 'HRK', 'HUF', 'RSD', 'BAM', 'MKD', 'RUB', 'CZK', 'PLN', 'BGN', 'NOK', 'SEK', 'DKK', 'AUD', 'CAD', 'JPY']

list2 = [('1,0748', '1,0508'), ('0,8639', '0,8399'), ('1,0942', '1,0602'), ('7,6508', '7,4208'), ('5,8900', '7,0900'), ('4,9400', '1,1400'), ('1,9850', '1,9190'), ('2,1100', '0,2900'), ('1,9393', '6,5393'), ('7,5440', '6,5440'), ('4,5090', '4,3610'), ('1,9790', '1,9250'), ('9,2471', '8,9071'), ('9,9290', '9,6090'), ('7,5521', '7,3281'), ('1,4444', '1,4004'), ('1,4528', '1,4048'), ('1,8300', '8,0300')]

我将如何制作一个字典,其中两个项目元组将是这些元组的值和 list1 键中的项目。

类似这样的:{'USD': (1.0748, 1.0508), 'GBP': (0.8639, 0.8399), etc.}.

list one 中的第一项与 list2 中的第一个元组一起使用,第二项与第二个一起使用,依此类推。

此外,如您所见,“数字”是 list2 中的字符串,但在字典中变为浮点数。如何以最简单的方式做到这一点?

感谢您的帮助。

【问题讨论】:

  • 粗略的做法:d = {i:(float(j[0].replace(',', '.')),float(j[1].replace(',', '.'))) for i,j in zip(list1, list2)}
  • @Farhan.K:如果这是为了解决 OP 的问题而我们没有结束这个问题,为什么它是评论而不是答案?

标签: python python-3.x dictionary tuples


【解决方案1】:

您应该首先将值从字符串转换为浮点数:

f_list2 = [tuple(map(float, [i.replace(',','.'), j.replace(',','.')])) for (i,j) in list2]

这只是遍历每个元组中的每个子元素,用'.' 替换出现的',',并通过使用map 使它们成为floats;将 map 结果包装在 tuple 中会对其进行扩展,并将元组中的元素保持原样。

然后使用zip 将这些对传递给dict。 dict 也接受元组对 (key, val),它用于相应地初始化 key 和 value。所以:

d = dict(zip(list1, f_list2))

d 现在有了内容:

{'AUD': (1.4444, 1.4004),
 'BAM': (1.985, 1.919),
 'BGN': (1.979, 1.925),
 'CAD': (1.4528, 1.4048),
 'CHF': (1.0942, 1.0602),
 'CZK': (7.544, 6.544),
 'DKK': (7.5521, 7.3281),
 'GBP': (0.8639, 0.8399),
 'HRK': (7.6508, 7.4208),
 'HUF': (5.89, 7.09),
 'JPY': (1.83, 8.03),
 'MKD': (2.11, 0.29),
 'NOK': (9.2471, 8.9071),
 'PLN': (4.509, 4.361),
 'RSD': (4.94, 1.14),
 'RUB': (1.9393, 6.5393),
 'SEK': (9.929, 9.609),
 'USD': (1.0748, 1.0508)}

【讨论】:

  • 如果这是答案,我们应该将这个问题作为一个副本关闭。但这个问题还有第二个组成部分,涉及将逗号作为十进制标记字符串转换为浮点数。
【解决方案2】:

正则表达式的方式

list1 = ['USD', 'GBP', 'CHF', 'HRK', 'HUF', 'RSD', 'BAM', 'MKD', 'RUB', 'CZK', 'PLN', 'BGN', 'NOK', 'SEK', 'DKK', 'AUD', 'CAD', 'JPY']
list2 = [('1,0748', '1,0508'), ('0,8639', '0,8399'), ('1,0942', '1,0602'), ('7,6508', '7,4208'), ('5,8900', '7,0900'), ('4,9400', '1,1400'), ('1,9850', '1,9190'), ('2,1100', '0,2900'), ('1,9393', '6,5393'), ('7,5440', '6,5440'), ('4,5090', '4,3610'), ('1,9790', '1,9250'), ('9,2471', '8,9071'), ('9,9290', '9,6090'), ('7,5521', '7,3281'), ('1,4444', '1,4004'), ('1,4528', '1,4048'), ('1,8300', '8,0300')]
import re
d = dict(zip( list1, eval( re.sub("'(\d+),(\d+)'", r'\1.\2', str(list2)) ) ))
# replace eval with ast.literal_eval if the source of list2 might be dangerous

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2018-10-01
    • 2023-04-07
    • 2019-08-23
    • 1970-01-01
    • 2018-04-25
    • 2014-12-08
    相关资源
    最近更新 更多