【问题标题】:How can I match a list of items against keys in a dictionary?如何将项目列表与字典中的键匹配?
【发布时间】:2020-08-08 13:52:05
【问题描述】:

这看起来很简单,但我不知道出了什么问题。

首先我收集一个目录中与特定字符串匹配的所有文件名的列表:

import os
import glob
dl = glob.glob('dir/*abc*')
for f in dl:
    fn = os.path.basename(f)

所以现在我有一个文件名列表fn,其中包含"abc"。到目前为止一切顺利。

我想要做的是浏览这个文件名列表,尝试将它们与字典中的一组键进行匹配,只要有匹配项,就打印出该匹配键对应的字典值。

这就是我所做的:

fn_dict = {"abc.txt": "val1", "abc123.txt": "val2", "def.txt": "val3"}
for i in fn:
    if i in fn_dict.keys():
        print(fn_dict.get(i))
    else:
        print("No match")

我希望得到"val1""val2",但我只会一遍又一遍地得到"No match"

【问题讨论】:

  • 我可以建议在您的最小复制中,对变量 fn 的值进行硬编码。这样其他人就可以运行代码了。

标签: python python-3.x dictionary lookup


【解决方案1】:

fn 应该是一个列表,否则它将是一个字符串和字典部分,您将循环通过单个文件名而不是目录中与模式匹配的所有文件名

import os
import glob
dl = glob.glob('dir/*abc*')
fn = []
for f in dl:
    fn.append(os.path.basename(f))

或使用列表推导

fn = [os.path.basename(f) for f in dl]

【讨论】:

    【解决方案2】:

    在您的 for 循环中,您重新分配 fn 变量

    for f in dl:
        fn = os.path.basename(f) # fn is string now, not a list
    

    然后在您的第二个 for 循环中,您将通过 fn 变量,这是一个字符串,因此创建一个数组并将 os.path.basename(i) 添加到其中

    fn = []
    for f in dl:
        fn.append(os.path.basename(f))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-29
      • 2015-05-25
      • 2016-09-30
      • 2023-01-20
      • 2018-11-03
      • 1970-01-01
      • 2021-06-24
      • 1970-01-01
      相关资源
      最近更新 更多