首页 > 解决方案 > 从字典中弹出完全相同的值

问题描述

我有一个包含信息的一般列表:

lis = ["Hello", "Hello1", "Test"]

然后我有一个字典,其中包含 .c 文件的文件路径作为值和键是 lis 值的扩展,例如:

dict1 = {"/****Hello****/":
             ["C://test/hello/one.c",
              "C://test/hello/two.c"],
         "/****Hello1****/":
             ["C://test/helloNext/one.c",
              "C://test/helloNext/two.c"],
         "/****Test****/":
             ["C://test/bye/one.c",
              "C://test/bye/two.c"]}

这个想法是用 lis 的值替换 dict1 的键,如果 lis 的值在键信息中。

for x in lis:
    for y in dict1.copy():
        if x in y:
            dict1[x] = dict1.pop(y)

就目前而言,但现在我发现了一个大问题:

如果我这样做,则 dict1 的某些信息将被覆盖,因为在此示例中,它会搜索其中包含“Hello”的键并覆盖 dict1[0],但也会将 dict1[1] 覆盖为“Hello”而不是“Hello1” “因为这是第一个信息...

我自己无法找到解决方案。我想我只是错过了一点......

谢谢!

PS:仅仅从键中删除特殊字符不是解决方案,因为每个文件看起来都不一样。

标签: pythonpython-3.xdictionary

解决方案


一种方法是根据元素的长度对列表进行排序并以相反的顺序对其进行处理:

lis = ["Hello", "Hello1", "Test"]

dict1 = {"/****Hello****/": ["C://test/hello/one.c", "C://test/hello/two.c"],
         "/****Hello1****/": ["C://test/helloNext/one.c", "C://test/helloNext/two.c"],
         "/****Test****/": ["C://test/bye/one.c", "C://test/bye/two.c"]}

for x in sorted(lis, key=len, reverse=True):
    for y in dict1:
        if x in y and y not in lis:
            dict1[x] = dict1.pop(y)
            break

print(dict1)
# {'Hello1': ['C://test/helloNext/one.c', 'C://test/helloNext/two.c'], 'Hello': ['C://test/hello/one.c', 'C://test/hello/two.c'], 'Test': ['C://test/bye/one.c', 'C://test/bye/two.c']}

推荐阅读