如何匹配两个变量(列表和字典)中的数据并打印输出组合

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}]

经过一番思考后,我想到虽然您的 documentsdirectories 在示例数据中的 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 被重新排序,第一种方法将不起作用。