【问题标题】:python, how to update the dictionaries by mutating its format?python,如何通过改变其格式来更新字典?
【发布时间】:2013-11-20 22:03:21
【问题描述】:

所以我想做的是改变字典 该函数有4个参数 格式为{country_name:[location, population, president]}

def mutate dic(dic_format, country_name, field, new_data):
  dic_format = {country_name:['location', 'population', 'president']}
  if field == 'location':
    dic_format[:] = {country_name:[val, 'population', 'president']}
  elif field == 'population':
    dic_format[:] = {country_name:['location', val, 'president']}
  elif field == 'president':
    dic_format[:] = {country_name:['location', 'population', val]}

这是我正在考虑的,我知道它不起作用。 我该怎么做才能得到这样的输出:

>>>dict = {'canada':['North_America', '100M+', 'none']}
>>>mutate_dic(dict, 'canada', 'population', '150M+')
>>>dict
{'canada':['North_America', '150M+', 'none']}

【问题讨论】:

  • 为什么不使用字典作为主字典中的值?无论如何,如果您需要订购这些值,请使用collections.OrderedDict。喜欢:my_dict = {'canada': {'population':'100M+'}} 然后你可以这样做:my_dict['canada']['population'] = '150M+'
  • “使用字典作为主字典中的值”是什么意思?
  • @user2924679:评论中有一个例子。
  • 这种格式是由某些要求或其他代码强加给您的吗?您认为可能必须使用的东西,因为您无法想象任何其他方式,例如读取 CSV 文件;还是您只是无缘无故选择并且可以轻松更改的东西?
  • @abarnert 是的,我需要打开一个文件并阅读它。并使用格式作为文件中给出的内容

标签: python dictionary mutation


【解决方案1】:

您只想更新字典吗?

dict['canada'][1] = "150M+"

或者,使用嵌套字典以便您可以编写:

dict['canada']['population'] = "150M+"

【讨论】:

  • 遇到新国家时,初始化为字典:dict['canada'] = {"population" : "...", "economy" : "...", ...}
  • 在使用['canada'][1]='150M+'之前是否需要设置'population':1?对于 python 已经知道人口是 1 通过查看我的顺序?
  • Python 会因为您的列表顺序而知道。不过,您必须确保记住该顺序。这就是为什么在这种情况下,字典中的字典比字典中的列表要好。
【解决方案2】:

类似下面的东西应该可以工作:

def mutate_dic(dic, country_name, field, new_data):
    field_indices = {'location': 0, 'population': 1, 'president': 2}
    dic[country_name][field_indices[field]] = new_data

将其分解为更多步骤以便于理解:

list_to_change = dic[country_name]
index_of_field = field_indices[field]
list_to_change[index_of_field] = new_data

请注意,如果您使用字典或命名元组而不是列表作为字典中的值,这会容易得多。

【讨论】:

  • @sdasdadas:如果这个数据结构是强加给他的,这是我能想象到的最好的代码。 (如果field_indices 的数量多于三个,那么将field_indices 构造为{name: index for index, name in enumerate(field_names)} 可能会更好。否则,您还有什么不同的做法?)如果可以将数据结构更改为更合适的东西,显然这是一个更好的选择。
  • @abarnert 这就是我说的正确的原因 - 但是,正如您正确指出的那样,它应该具有不同的数据结构。
【解决方案3】:

更好的数据结构会让这件事变得简单。例如,而不是这个:

{country_name: [location, population, president]}

…假设你有这个:

{country_name: 
 {'location': location, 'population': population, 'president': president}}

那么你的功能就是:

def mutate_dic(dic, country_name, field, new_data):
    dic[country_name][field] = new_data

虽然真的,在这种情况下,该功能只是混淆事物。哪个更明显?

dic['canada']['population'] = '150M+'
mutate_dic(dic, 'canada', 'population', '150+')

如果你有,例如,Country 类,你可以做得更好——当有一个简短的静态字段列表时,为什么不把它们设为属性?

class Country(object):
    def __init__(self, location, population, president='none'):
        self.location = location
        self.population = population
        self.president = president

dic = {'canada': Country('North America', '150M+')}

dic['canada'].population = '100M+'

无论哪种方式,您都可以将数据文件直接读取为其中一种格式。由于您还没有向我们展示文件,我将制作一个,并展示如何阅读它:

数据文件:

name,location,population,president
Canada,North America,100M+,none
France,Europe,65.7M,Hollande

脚本:

import csv
with open('datafile', 'rb') as f:
    reader = csv.DictReader(f)
    dic = {row['name'].lower(): row for row in reader}
print dic

输出:

{'canada': {'location': 'North America',
  'name': 'Canada',
  'population': '100M+',
  'president': 'none'},
 'france': {'location': 'Europe',
  'name': 'France',
  'population': '65.7M',
  'president': 'Hollande'}}

但如果最坏的情况发生,您总是可以在输入后从一种格式转换为另一种格式:

dic = {name: {'location': value[0], 'population': value[1], 'president': value[2]}
       for name, value in dic.items()}

……或……

dic = {name: Country(*value) for name, value in dic.items()}

【讨论】:

  • 谢谢,现在我更了解字典在 python 中的工作原理了
猜你喜欢
  • 1970-01-01
  • 2022-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多