从列表字典中筛选元素

2024-06-16 17:20:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一本名为graph(directedgraph)的字典,里面有人和它的友谊,给出了友谊的权重。我想去掉这条格言里的一个特定的人,或者改变这段友谊的分量。在字典里我有几套冰袋。字典看起来像这样:

graph={'Name1': [('Name2', 1),('Name3',3),('Name8',2)], 'Name5': [('Name1',2), ('Name3',5)], 'Name2':[('Name3',1),('Name5',4)]}

我想删除一个特定人的特定朋友。例如,我想将“Name8”从“Name1”的友谊中删除,从而生成以下新词典:

graph={'Name1': [('Name2', 1),('Name3',3)], 'Name5': [('Name1',2), ('Name3',5)], 'Name2':[('Name3',1),('Name5',4)]}

另一个问题是改变友谊的分量。例如,将“Name5”友谊与“Name3”的权重更改为2,结果如下:

graph={'Name1': [('Name2', 1),('Name3',3),('Name8',2)], 'Name5': [('Name1',2), ('Name3',2)], 'Name2':[('Name3',1),('Name5',4)]}

Tags: 字典朋友词典graph分量权重name1格言
1条回答
网友
1楼 · 发布于 2024-06-16 17:20:52

对于第一个问题,一种方法是从dictionary中过滤'Name1'键值,并将其他键值与dictionary unpacking操作符合并(有关此用法的更多信息here):

{**graph, **{'Name1':[(i,j) for i,j in graph['Name1'] if i != 'Name8']}}

{'Name1': [('Name2', 1), ('Name3', 3)],
 'Name5': [('Name1', 2), ('Name3', 5)],
 'Name2': [('Name3', 1), ('Name5', 4)]}

第二,同样的,你可以做:

{**graph, **{'Name5':[(i,j) if i != 'Name3' else (i,2) for i,j in graph['Name5']]}}

{'Name1': [('Name2', 1), ('Name3', 3), ('Name8', 2)],
 'Name5': [('Name1', 2), ('Name3', 2)],
 'Name2': [('Name3', 1), ('Name5', 4)]}

多条件过滤通解:

from collections import defaultdict

d = defaultdict(list)
for k,v in graph.items():
    if k == 'Name1':
        for i,j in v:
            if i != 'Name8':
                d[k].append((i,j))
    elif k == 'Name5':
        for i,j in v:
            if i != 'Name3':
                d[k].append((i,2))     
            else:
                d[k].append((i,j))     
    else:
        d[k].append(v)

相关问题 更多 >