如何匹配两个变量(列表和字典)中的数据并打印输出组合
How to match data in two variables (list and dict) and print output combined
我有两个变量:
documents = [
{'type': 'passport', 'number': '2207 876234', 'name': 'Smith'},
{'type': 'invoice', 'number': '11-2', 'name': 'Obama'},
{'type': 'insurance', 'number': '10006', 'name': 'Carpenter'}
]
directories = {'1': ['2207_876234', '11-2'], '2': ['10006'], '3': ['0']}
我必须编写代码才能以以下格式输出:
№:2207 876234,类型:passport,所有者:Smith,货架编号:1 №:11-2,类型:invoice,所有者:Obama,货架编号:1 №:10006,类型:insurance,所有者:Carpenter,货架编号: 2
所以我写了一段代码开始
for k, v in directories.items():
for info in documents:
if v in [info]:
print(k([info['number']]))
这似乎不正确。有经验的人可以告诉我如何将两个变量组合成一种输出格式吗?
这是一个解决方案:
通过以下方式匹配值:
l=[]
for i in directories.values():
for k in i:
for y in documents:
if y['number']==k:
y['shelf number']=k
l.append(y)
更改键名:
res=[]
for i in l:
i['No']=i.pop('number')
i['owner']=i.pop('name')
res.append(i)
print(res)
输出:
[{'type': 'invoice', 'shelf number': '11-2', 'No': '11-2', 'owner': 'Obama'}, {'type': 'insurance', 'shelf number': '10006', 'No': '10006', 'owner': 'Carpenter'}]
这不是最漂亮的,但很管用。
documents = [
{'type': 'passport', 'number': '2207 876234', 'name': 'Smith'},
{'type': 'invoice', 'number': '11-2', 'name': 'Obama'},
{'type': 'insurance', 'number': '10006', 'name': 'Carpenter'}
]
directories = {'1': ['2207_876234', '11-2'], '2': ['10006'], '3': ['0']}
entry_count = 0
out = []
for j,k in enumerate(directories):
v = directories[k]
for i,n in enumerate(directories[k]):
if n == '0':
break
data = documents[entry_count]
out.append({ 'No': n, 'type': data['type'], 'owner': data['name'], 'shelf number': j + 1 })
entry_count += 1
print(out)
输出:
[{'no': '2207_876234', 'type': 'passport', 'owner': 'Smith', 'shelf number': 1},
{'no': '11-2', 'type': 'invoice', 'owner': 'Obama', 'shelf number': 1},
{'no': '10006', 'type': 'insurance', 'owner': 'Carpenter', 'shelf number': 2}]
经过一番思考后,我想到虽然您的 documents
和 directories
在示例数据中的 number
值的顺序相同,但上述方法不会如果他们的订单发生变化,请暂停。
但是,directories['1']
中的第一个值与 documents
中的第一个数字不匹配 - '2207 876234' =/= '2207_876234'
如果我们更改 documents
中的数字以匹配 directories
中的数字,则以下代码可以工作,尽管速度较慢,但无论对象的顺序如何,都要确保数字值匹配:
documents = [
{'type': 'passport', 'number': '2207_876234', 'name': 'Smith'},
{'type': 'invoice', 'number': '11-2', 'name': 'Obama'},
{'type': 'insurance', 'number': '10006', 'name': 'Carpenter'}
]
directories = {'1': ['2207_876234', '11-2'], '2': ['10006'], '3': ['0']}
out = []
for j,k in enumerate(directories):
v = directories[k]
for i,n in enumerate(directories[k]):
data = next((d for d in documents if n == d['number']), None)
if not data:
continue
out.append({ 'No': n, 'type': data['type'], 'owner': data['name'], 'shelf number': j + 1 })
print(out)
输出:
[{'No': '2207_876234', 'type': 'passport', 'owner': 'Smith', 'shelf number': 1},
{'No': '11-2', 'type': 'invoice', 'owner': 'Obama', 'shelf number': 1},
{'No': '10006', 'type': 'insurance', 'owner': 'Carpenter', 'shelf number': 2}]
请注意,输出是相同的,但如果 documents
被重新排序,第一种方法将不起作用。
我有两个变量:
documents = [
{'type': 'passport', 'number': '2207 876234', 'name': 'Smith'},
{'type': 'invoice', 'number': '11-2', 'name': 'Obama'},
{'type': 'insurance', 'number': '10006', 'name': 'Carpenter'}
]
directories = {'1': ['2207_876234', '11-2'], '2': ['10006'], '3': ['0']}
我必须编写代码才能以以下格式输出: №:2207 876234,类型:passport,所有者:Smith,货架编号:1 №:11-2,类型:invoice,所有者:Obama,货架编号:1 №:10006,类型:insurance,所有者:Carpenter,货架编号: 2
所以我写了一段代码开始
for k, v in directories.items():
for info in documents:
if v in [info]:
print(k([info['number']]))
这似乎不正确。有经验的人可以告诉我如何将两个变量组合成一种输出格式吗?
这是一个解决方案:
通过以下方式匹配值:
l=[]
for i in directories.values():
for k in i:
for y in documents:
if y['number']==k:
y['shelf number']=k
l.append(y)
更改键名:
res=[]
for i in l:
i['No']=i.pop('number')
i['owner']=i.pop('name')
res.append(i)
print(res)
输出:
[{'type': 'invoice', 'shelf number': '11-2', 'No': '11-2', 'owner': 'Obama'}, {'type': 'insurance', 'shelf number': '10006', 'No': '10006', 'owner': 'Carpenter'}]
这不是最漂亮的,但很管用。
documents = [
{'type': 'passport', 'number': '2207 876234', 'name': 'Smith'},
{'type': 'invoice', 'number': '11-2', 'name': 'Obama'},
{'type': 'insurance', 'number': '10006', 'name': 'Carpenter'}
]
directories = {'1': ['2207_876234', '11-2'], '2': ['10006'], '3': ['0']}
entry_count = 0
out = []
for j,k in enumerate(directories):
v = directories[k]
for i,n in enumerate(directories[k]):
if n == '0':
break
data = documents[entry_count]
out.append({ 'No': n, 'type': data['type'], 'owner': data['name'], 'shelf number': j + 1 })
entry_count += 1
print(out)
输出:
[{'no': '2207_876234', 'type': 'passport', 'owner': 'Smith', 'shelf number': 1},
{'no': '11-2', 'type': 'invoice', 'owner': 'Obama', 'shelf number': 1},
{'no': '10006', 'type': 'insurance', 'owner': 'Carpenter', 'shelf number': 2}]
经过一番思考后,我想到虽然您的 documents
和 directories
在示例数据中的 number
值的顺序相同,但上述方法不会如果他们的订单发生变化,请暂停。
但是,directories['1']
中的第一个值与 documents
中的第一个数字不匹配 - '2207 876234' =/= '2207_876234'
如果我们更改 documents
中的数字以匹配 directories
中的数字,则以下代码可以工作,尽管速度较慢,但无论对象的顺序如何,都要确保数字值匹配:
documents = [
{'type': 'passport', 'number': '2207_876234', 'name': 'Smith'},
{'type': 'invoice', 'number': '11-2', 'name': 'Obama'},
{'type': 'insurance', 'number': '10006', 'name': 'Carpenter'}
]
directories = {'1': ['2207_876234', '11-2'], '2': ['10006'], '3': ['0']}
out = []
for j,k in enumerate(directories):
v = directories[k]
for i,n in enumerate(directories[k]):
data = next((d for d in documents if n == d['number']), None)
if not data:
continue
out.append({ 'No': n, 'type': data['type'], 'owner': data['name'], 'shelf number': j + 1 })
print(out)
输出:
[{'No': '2207_876234', 'type': 'passport', 'owner': 'Smith', 'shelf number': 1},
{'No': '11-2', 'type': 'invoice', 'owner': 'Obama', 'shelf number': 1},
{'No': '10006', 'type': 'insurance', 'owner': 'Carpenter', 'shelf number': 2}]
请注意,输出是相同的,但如果 documents
被重新排序,第一种方法将不起作用。