简体   繁体   English

根据列表中的项目创建带有键的 Python 字典

[英]Creating Python dictionaries with keys based on items in list of list

I'm creating a dictionary where if the key has an 'R' then one list, otherwise it goes in the list for 'E' .我正在创建一个字典,如果键有一个'R'那么一个列表,否则它会进入'E'的列表。 My code so far:到目前为止我的代码:

d1 = {'SSW 540': ['E', 'SYEN'], 'SSW 564': ['R', 'SFEN'], 'SSW 567': ['R', 'SFEN'], 'CS 501': ['E', 'SFEN']}

rlist = []
elist = []

for k, v in d1.items():
    if v[0] == 'R':
        rlist.append([v[1], k])
    elif v[0] == 'E':
        elist.append([v[1], k])

Output is:输出是:

rlist = [['SFEN', 'SSW 564'], ['SFEN', 'SSW 567']]
elist = [['SYEN', 'SSW 540'], ['SFEN', 'CS 501']]

How could I create two dictionaries, call them rdict and edict where:我怎么可以创建两个库,给他们打电话rdictedict ,其中:

rdict = {'SFEN': ['SSW 564','SSW 567']}
edict = {'SYEN': ['SSW 540'], 'SFEN': ['CS 501']}

There could be more values than just 'SYEN' and 'SFEN' so it needs to be any particular first element in the list.可能有更多的值,而不仅仅是'SYEN''SFEN'因此它需要是列表中的任何特定第一个元素。

If I try something like:如果我尝试类似的事情:

mlist = {}

for list in rlist:
    if list[0] in rlist:
        mlist.append(list[1])
    else:
        mlist[list[0]].append(list[1])

I get KeyError: 'SFEN' .我得到KeyError: 'SFEN' Could I use defaultdict for this?我可以为此使用 defaultdict 吗?

There is a way to create m_dict from d1 directly.有一种方法可以直接从d1创建m_dict

d1 = {
    'SSW 540': ['E', 'SYEN'],
    'SSW 564': ['R', 'SFEN'],
    'SSW 567': ['R', 'SFEN'],
    'CS 501': ['E', 'SFEN'],
}

m_dict = {}
for value, (category, key) in d1.items():
    m_dict.setdefault(category, {}).setdefault(key, []).append(value)

print(m_dict)

output:输出:

{'E': {'SYEN': ['SSW 540'], 'SFEN': ['CS 501']}, 'R': {'SFEN': ['SSW 564', 'SSW 567']}}

Explanation:解释:

  • dict.setdefault(key, default)
    • It sets at key by default if key doesn't exist.如果key不存在,它default设置为key
    • And return always value of key itself.并始终返回key本身的值。
  • for value, (category, key) in d1.items():
    • You can unpack fixed-length tuple, list, or other sequences.您可以解包固定长度的元组、列表或其他序列。
    • So it is equivalent with:所以它等价于:
for value, tuple_ in d1.items():
    category, key = tuple_

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM