【问题标题】:Nestled List Comprehension using Dictionaries使用字典的嵌套列表理解
【发布时间】:2017-05-26 23:13:45
【问题描述】:

我有一个这样的列表:

mydict = {
              'Alpha' : {'l':'a','n':1,'q':3,'z':4},
              'Beta'  : {'l':'b','n':2,'q':2,'z':5},
              'Gamma' : {'l':'c','n':3,'q':1,'z':6}
         }
# Or
mydict = {'Alpha': {'l': 'a', 'n': 1, 'q':3, 'z':4}, 'Beta': {'l': 'b', 'n': 2, 'q':2, 'z':5}, 'Gamma': {'l': 'c', 'n': 3, 'q':1, 'z':6}}

我的输出需要是:

[['Alpha:','a',1,3,4],['Beta:','b',2,2,5],['Gamma:',c,3,1,6]]
# Or
[
    ['Alpha:' ,'a'  ,1  ,3  ,4],
    ['Beta:'  ,'b'  ,2  ,2  ,5],
    ['Gamma:' ,'c'  ,3  ,1  ,6]
]

我的目标是:

[[x,y['l'],y['n'],y['q'],y['z']] for x,y in mydict.items()]

但我不想使用y['l'],y['n'],我想使用另一个字典理解。这可能吗?例如,如果我将我的密钥'l' 修改为'a',则代码将不起作用,如果我添加一个新密钥'x',它将不会显示。
PD:数字是整数还是字符串都没有关系(最好是字符串)。

【问题讨论】:

  • 输出字符串中的冒号是故意的吗?
  • @chepner,你的意思是关于结果的 [] 吗?是的,我需要它们。我会把结果放在tabulate模块中
  • 绝对有可能,但是注意字典是无序的,所以词条的顺序会随意排列。例如[[x] + y.values() for x, y in mydict.items()] 之类的东西
  • @Hamms,如果我输入[[x] + y.values() for x, y in mydict.items()],请给我错误。 "TypeError: can only concatenate list (not "dict_values") to list."
  • @Hamms,我发现你的代码升级了:这个[[x, *y.values()] for x, y in mydict.items()] 工作得很好。

标签: python python-3.x dictionary list-comprehension


【解决方案1】:

你可以试试这个:

mydict = {'Alpha': {'l': 'a', 'n': 1, 'q':3, 'z':4}, 'Beta': {'l': 'b', 'n': 2, 'q':2, 'z':5}, 'Gamma': {'l': 'c', 'n': 3, 'q':1, 'z':6}}

new_list = [[i]+b.values() for i, b in mydict.items()]

【讨论】:

  • 这给了我错误,但使用类似的代码[[x, *y.values()] for x, y in mydict.items()] 我得到了输出。
  • 此解决方案仅适用于 Python 2。一个适用于 Python 3 的脚本是 @Ender Look's。
  • 啊,py2...在标签中我放了py3。
【解决方案2】:

在 cmets 中使用 Hamms 的想法我找到了解决方案:

[[x+':', *y.values()] for x, y in mydict.items()]

这给出了正确的输出。

【讨论】:

  • 您的代码假设 dict 键将以相同的方式排序。虽然今天确实如此,但您应该按键排序,以防止将来发生顺序更改的 dict 实现。
  • @mattmc3,这个字典不会得到新的值,所以我喜欢他的排序,有什么问题吗?我不能很好地理解你的评论......对不起。
  • 巧合的是,'l'、'n'、'q' 和 'z' 键在所有 3 个嵌套 dicts 中按顺序出现。借助您的答案,面向未来的解决方案更像是[[x, [z[1] for z in sorted(y.items())]] for x, y in mydict.items()]
  • @mattmc3,对不起,我的代码你的代码有什么区别。我的不接受新密钥,而你的呢?你的密码按字母顺序排列我的钥匙?
  • *y.values() 假设所有 3 个字典将以相同的顺序(按键)返回它们的值。我的实现消除了这个假设并保证了它。
【解决方案3】:

您可以遍历字典的每一层并将值作为字符串附加到嵌套列表中。

outLst = []

for oKey in mydict.keys():
    outLst.append([oKey+':'])
    for iKey in mydict[oKey]:
        outLst[-1].append(str(mydict[oKey][iKey]))
print outLst

输出在哪里:

[['Alpha:', '3', '4', 'a', '1'], ['Beta:', '2', '5', 'b', '2'], ['Gamma:', '1', '6', 'c', '3']]

如果你想对输出列表进行排序,我可以修改代码来做到这一点。

【讨论】:

  • 有没有办法在一行中做到这一点?
【解决方案4】:
[ [ key+':', *value.values()] for key,value in mydict.items()]

[['Alpha:', 'a', 1, 3, 4], ['Beta:', 'b', 2, 2, 5], ['Gamma:', 'c', 3, 1, 6]]

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
  • 您的代码运行良好,但我在 10 小时前找到了答案,here。所以我只会投票给您。无论如何,谢谢。
【解决方案5】:
[[x] + y.values() for x, y in mydict.items()]

【讨论】:

  • [[x] + y.values() for x, y in mydict.items()] 给出错误。我使用[[x, *y.values()] for x, y in mydict.items()]找到了解决方案。
  • 什么错误?我的代码适用于您的数据。输出为[['Alpha', 3, 4, 'a', 1], ['Beta', 2, 5, 'b', 2], ['Gamma', 1, 6, 'c', 3]]
  • TypeError: can only concatenate list (not "dict_values") to list.
  • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
  • @EnderLook 我的代码适用于 python 3.4,您的代码引发了SyntaxError: can use starred expression only as assignment target。似乎您使用的是较新的python。我猜是 3.5 或 3.6。
猜你喜欢
  • 2016-06-09
  • 1970-01-01
  • 2021-02-23
  • 2021-12-22
  • 2013-11-15
  • 2020-01-08
  • 1970-01-01
  • 1970-01-01
  • 2019-10-23
相关资源
最近更新 更多