Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按键折叠字典_Python_Python 2.7 - Fatal编程技术网

Python 按键折叠字典

Python 按键折叠字典,python,python-2.7,Python,Python 2.7,我在将CSV读入词典并按键折叠词典时遇到问题。我有足够的代码达到这一点(我有每个州的所有县): 但我希望得到以下结果: {'County': '02013', 'State': 'Alaska', 'Rate': '28.38692673', 'Zips': ['99553', '99571', '99583', '99612']} 我当前的python代码是: with open('../models/mock_data/geography_data.csv', 'r') as f: re

我在将CSV读入词典并按键折叠词典时遇到问题。我有足够的代码达到这一点(我有每个州的所有县):

但我希望得到以下结果:

{'County': '02013', 'State': 'Alaska', 'Rate': '28.38692673', 'Zips': ['99553', '99571', '99583', '99612']}
我当前的python代码是:

with open('../models/mock_data/geography_data.csv', 'r') as f:

result = {}
red = csv.DictReader(f)
我已尝试添加以下内容:

for d in red:
    result.setdefault(d["County"], [d["State"], d["Rate"]]).append(d["Zip"])
但这会导致如下数据(缺少键)

使用
iteritems()
setdefaultdict()
(比如这个:)还有很多其他类似的问题,但我想我对这些过程的理解还不够,无法在我的特定情况下实现它们。欢迎任何和所有的帮助

--更新--

好吧,所以@timegb对我帮助很大,但我最喜欢使用蛮力方法:

with open('../models/mock_data/all_geo_data.csv', 'r') as f:
    reader = csv.reader(f)
    header = next(reader)
    dicts = [dict(zip(header, map(str,row))) for row in reader]

    counties = []
    result = []

    for i in dicts:
        zips = []
        if i["County"] not in counties:
            counties.append(i["County"])
            zips.append(i["Zip"])
            temp_dict = {"County": i["County"], "State" : i["State"], "Zip" : zips, "Rate" : i["Median_CNC_Labor_Rate"] }
            result.append(temp_dict)

    for i in dicts:
        for j in result:
            if i["County"] == j["County"] and i["Zip"] not in j["Zip"]:
            j["Zip"].append(i["Zip"])
这里有一个解决方案:

>>> from ast import literal_eval
>>> with open('testfile') as f:
...     dicts = [literal_eval(line) for line in list(f)]
...     result = {'Zips':[d['Zip'] for d in dicts]}
...     result.update(dicts[0])
...     del result['Zip']
...     del dicts
... 
>>> result
{'Zips': ['99553', '99571', '99583', '99612'], 'County': '02013', 'State': 'Alaska', 'Rate': '28.38692673'}
我们将
literal\u eval
文件中的所有行。结果是第一个将键“Zips”的值设置为所有字典的zip值列表的字典。如果您不需要其他词典,您可以在最后发布
deldicts

更新

看起来你已经有了一个阅读csv文件的字典列表,我称之为
dicts
。在这种情况下,代码将自身简化为:

result = {'Zips':[d['Zip'] for d in dicts]}
result.update(dicts[0])
del result['Zip']
试一试

from ast import literal_eval
with open('your_file_name') as sub: 
array = [literal_eval(line) for line in list(sub)]
sol_n = {'time':[each['time'] for each in array]}
sol_n.update(array[0])
del sol_n['time']
del dicts

我收到一个格式错误的字符串错误。我并不完全理解这一点,因为我不相信数据中有任何东西可能导致它。你认为这是Python2.7与Python3的问题吗?@wsankey抱歉,我不能重现这个错误。我将您的数据复制粘贴到我的测试文件中。我在Python2和Python3中测试了代码,它在这两种环境中都能工作。您的输入文件很可能已损坏/格式不正确。您是否尝试通过复制粘贴此处提供的输入文件来创建新的输入文件?@wsankey或者您提供的前四行不是您的输入文件?在这种情况下,答案更简单,我们可以省略整个文件I/O,我只需要知道您的现有词典是否存在于任何集合中,或者它们是如何存储的。很抱歉,没有明确说明。我通过运行以下代码并复制和粘贴DictReader的输出来接收这些行。他们不是我的意见。我有一个CSV作为输入。另外,我划出了一个空键,它刚刚出现在我的字典列表中。我想如果我能删除它,它会解决这个问题,你的代码也会工作。红色=csv。红色行的DictReader(f):打印行。在这种情况下,只需将您的词典附加到列表中,同时在中阅读它们即可。我相应地更新了我的答案。为什么OP“尝试这个”?一个好的答案总是会有一个解释,说明做了什么以及为什么这样做,不仅是为了OP,而且是为了未来的访客,这样他们可能会发现这个问题并阅读你的答案。哇,没有不敬,但它回答了这个问题。至少它是一种东西。不需要敌意,这不是敌意或不尊重。我没有说这不是一个答案。这只是一个关于如何改进答案的建议。对不起,这是我的误解。我将按照建议努力改进答案。谢谢
result = {'Zips':[d['Zip'] for d in dicts]}
result.update(dicts[0])
del result['Zip']
from ast import literal_eval
with open('your_file_name') as sub: 
array = [literal_eval(line) for line in list(sub)]
sol_n = {'time':[each['time'] for each in array]}
sol_n.update(array[0])
del sol_n['time']
del dicts