如何将多行字典转换为单个格式的字典? -Python

时间:2019-04-04 06:48:56

标签: python-3.x

我的代码:

with open('C:\\Users\\d883531\\Downloads\\jira.csv',encoding='utf-8', 
mode='r')
jira = list(csv.reader(j, delimiter=","))
for row in jira:
    row12 = row[12]
    ab = re.findall(r'ab-\d{4}-\d{7}', row12)
    abc = re.findall(r'abc-\d{3}', row12)
    if ab or abc:
        ab_list = ab
        abc_list = abc
        j_dict = dict(zip_longest(ab_list, abc_list))
        print(j_dict)    

我当前的python代码像这样打印出字典:

{'ab-1111-1111111': 'abc-123'}
{'ab-2222-2222222': None}
{'ab-3333-3333333': None}
{'ab-4444-4444444': None}
{'ab-5555-5555555': None}

我希望它像这样打印字典:

{'ab-1111-1111111': 'abc-123','ab-2222-2222222': None,'ab-3333-3333333': 
None, 
'ab-4444-4444444': None, 'ab-5555-5555555': None}

非常感谢您的帮助。

编辑:更新的代码

j_dict = {}
for row in jira:
    ab = re.findall(r'SO-\d{4}-\d{7}', row[12])
    abc = re.findall(r'SECD-\d{3}', row[12])
    if ab or abc:
        j_dict.update(zip_longest(ab, abc))
print(j_dict)

此打印:

{'ab-1111-1111111': None,'ab-2222-2222222': None,'ab-3333-3333333': 
None, 
'ab-4444-4444444': None, 'ab-5555-5555555': None}

但是第一个None应该是abc-123

2 个答案:

答案 0 :(得分:1)

您可以按以下方式使用dict.update

j_dict.update(zip_longest(ab_list, abc_list))

更新j_dict而不是重新定义它。确保在j_dict循环之前定义for。这会产生副作用,如果连续出现ab个重复项,则最后一个字典中将出现最新的出现。

如果您希望第一次出现,可以执行以下操作:

j_dict = dict(zip_longest(ab_list, abc_list), **j_dict)

这利用了dict constructor的功能:

  

如果给出了关键字参数,则关键字参数及其值将添加到根据位置参数创建的字典中。如果已经存在要添加的键,则关键字参数中的值将替换位置参数中的值。

答案 1 :(得分:1)

问题是您在j_dict循环的每次迭代中都重新定义了for(本质上替换了所有现有条目),而不是向其中添加了新条目。如Hodossy Szabolcs所述,您可以使用j_dict.update()添加新条目,然后在j_dict循环外打印for以打印所有条目。

并非您可以直接使用row[12]ababc。无需row[12] = row12等。

j_dict = {}
for row in jira:
    ab = re.findall(r'ab-\d{4}-\d{7}', row[12])
    abc = re.findall(r'abc-\d{3}', row[12])
    if ab or abc:
              j_dict.update(zip_longest(ab, abc))

print(j_dict)

编辑:update的一个问题是,如果重复,它将覆盖现有密钥。这是另一种方法,仅当j_dictab都匹配时,或者abc中不存在ab键时,才更新j_dict

j_dict = dict()
for row in jira:
        ab = re.findall(r'ab-\d{4}-\d{7}', row)
        abc = re.findall(r'abc-\d{3}', row)
        if ab and abc:
            j_dict.update(zip_longest(ab, abc))
        elif ab:
            for i in ab:
                if i not in j_dict:
                    j_dict.update(itertools.zip_longest(ab, abc))

print(j_dict)