首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何匹配两个变量(list和dict)中的数据并组合打印输出

如何匹配两个变量(list和dict)中的数据并组合打印输出
EN

Stack Overflow用户
提问于 2021-07-03 14:45:41
回答 2查看 65关注 0票数 0

我有两个变量:

代码语言:javascript
运行
复制
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,类型:护照,所有者: Smith,书架编号:1№:11-2,类型:发票,船主:奥巴马,货架编号:1№:10006,类型:保险,所有者:木匠,货架编号:2

所以我已经写了一段代码

代码语言:javascript
运行
复制
for k, v in directories.items():
    for info in documents:
        if v in [info]:
            print(k([info['number']]))

这似乎不对。有经验的人能给我一个关于如何在一个输出格式中组合两个变量的想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-03 15:32:34

这不是最漂亮的,但很管用。

代码语言:javascript
运行
复制
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)

输出:

代码语言:javascript
运行
复制
[{'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}]

在对此进行了思考之后,我突然想到,虽然您的documentsdirectoriesnumber值在示例数据中的顺序相同,但是如果它们的顺序发生变化,上面的方法就不会继续运行。

但是,directories['1']中的第一个值与documents - '2207 876234' =/= '2207_876234'中的第一个数字不匹配。

如果我们将documents中的数字更改为与directories中的数字匹配,则以下代码工作正常,尽管速度较慢,但无论对象的顺序如何,都要确保数字值匹配:

代码语言:javascript
运行
复制
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)

输出:

代码语言:javascript
运行
复制
[{'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被重新排序,第一个方法将无法工作。

票数 1
EN

Stack Overflow用户

发布于 2021-07-03 15:24:05

以下是一个解决方案:

通过以下方式匹配值:

代码语言:javascript
运行
复制
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)

更改关键名称:

代码语言:javascript
运行
复制
res=[]
for i in l:
    i['No']=i.pop('number')
    i['owner']=i.pop('name')
    res.append(i)

print(res)

输出:

代码语言:javascript
运行
复制
[{'type': 'invoice', 'shelf number': '11-2', 'No': '11-2', 'owner': 'Obama'}, {'type': 'insurance', 'shelf number': '10006', 'No': '10006', 'owner': 'Carpenter'}]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68237268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档