我的代码:
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
。
答案 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]
,ab
和abc
。无需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_dict
和ab
都匹配时,或者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)