【问题标题】:How to add mutiple values in a dictionary from file in python如何从python中的文件在字典中添加多个值
【发布时间】:2018-05-14 18:27:18
【问题描述】:

给定一个文件 data.txt: 包含国家名称及其人口和地区的列表,该文件如下所示:

China|1,339,190,000|9,596,960.00
Brazil|193,364,000|8,511,965.00
Japan|127,380,000|377,835.00
Canada|34,207,000|9,976,140.00
Indonesia|260,581,100|1,809,590.97

我想创建一个包含国家名称(键)和两个值(人口和面积)的字典。

最终的输出应该是这样的:

China:[1339190000,9596960.00]

人口是整数,面积是浮点数。

这是我的代码,我不知道我做错了什么,我想知道是否有人可以为我指出。

谢谢。

这是我的代码:

Country = {}
file = open("data.txt", "r")
for i in file :
  file1 = i.strip(",") 
  parts = i.split("|")
  length = len(file[i])
  if length in parts:
    Country[length][i] = file[i]
  else:
    Country[length] = {i: file[i]}
  print(parts)

【问题讨论】:

  • 解释器没有告诉你len(file[i])有问题吗?
  • 您请求的{China:1339190000:9596960.00} 格式不正确。格式为 {key: item}。
  • @Daniel Copley 中国呢:1339190000:9596960.00
  • 不,那也行不通。您使用字典的想法是正确的。但是格式不是 {key:item:item}。您可以做的是将两个数字都转换为字符串并像这样存储它们。或者您可以使用列表来保存每个键的多个项目。示例:{key: [item1, item2]}{key: 'item1:item2'}
  • @Daniel Copley 我明白了,谢谢

标签: python python-3.x file dictionary


【解决方案1】:

{China:1339190000:9596960.00} 语法无效;不过,你可以试试这个:

file_data = [i.strip('\n').split('|') for i in open('filename.txt')]
final_data = {i[0]:[c for c in map(float, [''.join(b.split(',')) for b in i[1:]])] for i in file_data}

输出:

{'Japan': [127380000.0, 377835.0], 'Canada': [34207000.0, 9976140.0], 'Brazil': [193364000.0, 8511965.0], 'Indonesia': [260581100.0, 1809590.97], 'China': [1339190000.0, 9596960.0]}

【讨论】:

    【解决方案2】:

    您可以使用 pandas,read_csv 并使用千位分隔符。

    import pandas as pd
    
    cols = ['Country','Pop','Area']
    df = pd.read_csv(filename,sep="|",thousands=r',',header=None,names=cols,index_col=cols[0])
    d = {t[0]:t[1:] for t in df.itertuples()}
    

    d 现在是一个字典:

    {'Brazil': (193364000, 8511965.0),
     'Canada': (34207000, 9976140.0),
     'China': (1339190000, 9596960.0),
     'Indonesia': (260581100, 1809590.97),
     'Japan': (127380000, 377835.0)}
    

    旧代码

    d = df.to_dict('i') # returns float instead of int
    d = {t[0]:dict(zip(df.columns,t[1:])) for t in df.itertuples()} # use this instead
    
    {'Brazil': {'Area': 8511965.0, 'Pop': 193364000},
     'Canada': {'Area': 9976140.0, 'Pop': 34207000},
     'China': {'Area': 9596960.0, 'Pop': 1339190000},
     'Indonesia': {'Area': 1809590.97, 'Pop': 260581100},
     'Japan': {'Area': 377835.0, 'Pop': 127380000}}
    

    【讨论】:

    • @cᴏʟᴅsᴘᴇᴇᴅ 你能帮我理解为什么 int 变成了 float。
    • Nvm 在查看源代码的文档中找到它... 注释 ----- 1. 因为iterrows 为每一行返回一个系列,它确实跨行保留数据类型(数据帧跨列保留数据类型)。例如,...所以改用 itertuples。
    【解决方案3】:

    您还可以编写一个简单的函数,该函数接受一个文件作为输入,并返回一个包含您的数据的字典。有很多不同的方法可以解决这个问题,唯一的限制是创造力。希望这会有所帮助:)

    def text_to_dict(filename):
    
        with open(filename, 'r') as file:
    
            data = file.read()
            line = data.split('\n')
    
            result = {}
    
            for item in line:
                item_list = item.split('|')
                result[item_list[0]] = item_list[1], item_list[2]
    
            return result
    
    print(text_to_dict('data.txt'))  # Calling our function
    
    # Output: {'China': ('1,339,190,000', '9,596,960.00'), 'Brazil': ('193,364,000', '8,511,965.00'), 'Japan': ('127,380,000', '377,835.00'), 'Canada': ('34,207,000', '9,976,140.00'), 'Indonesia': ('260,581,100', '1,809,590.97')}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 2017-01-04
      • 1970-01-01
      • 2014-06-27
      相关资源
      最近更新 更多