【问题标题】:ValueError: not enough values to unpack (expected 3, got 2) PythonValueError:没有足够的值来解包(预期 3,得到 2)Python
【发布时间】:2019-09-24 15:59:35
【问题描述】:

我正在尝试按以下格式打印字典。我想这样做是因为我需要使用 JSON 格式在 D3 中绘制一些趋势图。对于这种趋势,我计算了每个州在每个十年(1980 年代到 2010 年代)内的谋杀案数量。

我能够输出文件和所有内容,但是由于我正在尝试创建一个图形,因此 JSON 文件中的数据格式需要非常具体地标记字典中的每个键、值对输出。

xl = pd.ExcelFile('Wyoming.xlsx')
df = xl.parse('Sheet1')
year = df['Year']
state = df['State']
freq = dict()

for i in range(0, len(df)):
    currYear = year.iloc[i]
    if(currYear >= 1980 and currYear < 1989):
        currDecade = 1980
    elif(currYear >= 1990 and currYear < 2000):
        currDecade = 1990
    elif(currYear >= 2000 and currYear < 2010):
        currDecade = 2000
    elif(currYear >= 2010):
        currDecade = 2010
    currState = state.iloc[i]
    if currDecade in freq:
        if currState in freq[currDecade]:
            freq[currDecade][currState] += 1
        else:
            key = {currState: 1}
            freq[currDecade].update(key)
    else:
        key = {currDecade:{currState: 1}}
        freq.update(key)

#print(freq)
freq1 = [{'Decade': d, 'State': [{'State': s, 'Freq': f}]} for d, s, f in freq.items()]
print(freq1)

我收到错误“ValueError: no enough values to unpack (expected 3, got 2)”

我希望输出如下所示。

[{"Decade": "1980", "State": [{"State": "California", "Freq": 29591}, {"State": "Massachusetts", "Freq": 1742}, ...}]

【问题讨论】:

    标签: json python-3.x pandas


    【解决方案1】:

    罪魁祸首是for d, s, f in freq.items(),因为freq.items() 在频率中返回一个可迭代的(key, value) 对。既然你有嵌套的字典,试试这个:

    freq1 = [{'Decade': d, 'State': [{'State': s, 'Freq': f} for s, f in sdict.items()]}
      for d, sdict in freq.items()
    ]
    

    【讨论】:

    • 我认为您还需要按十年汇总各州。
    • 我从中得到的输出与我的预期输出不同。我希望这些州属于十年组,而不是每个州都重复十年。
    【解决方案2】:

    dict.items() 仅迭代具有两个元素的元组:键和值。

    freq1 = []
    for decade, states in freq.items():
        freq1.append({
            'Decade': decade,
            'State': []
        })
        for state, freq in states.items():
            freq1['State'].append([{'State': state, 'Freq': freq}])
    print(freq1)
    

    我认为这样的代码更具可读性。但是,如果您仍然更喜欢单行列表理解解决方案,这里是:

    freq1 = [{'Decade': d, 'State': [{'State': s, 'Freq': f} for s, f in ss.items()]} for d, ss in freq.items()]
    

    【讨论】:

      猜你喜欢
      • 2017-07-04
      • 2020-07-17
      • 1970-01-01
      • 2017-09-14
      • 1970-01-01
      • 2019-01-05
      • 2020-09-28
      • 2021-10-07
      • 2022-01-21
      相关资源
      最近更新 更多