【问题标题】:Dealing with lists in a dictionary处理字典中的列表
【发布时间】:2019-12-11 11:48:44
【问题描述】:

我正在遍历一些文件夹以读取该列表中的所有对象,以便稍后移动未拒绝的对象。由于文件夹和文件的数量可能会有所不同,基本上我设法创建了一个字典,其中每个文件夹都是一个键,项目是项目。在虚拟情况下,我有: 遍历文件夹来源的数量(已知但可能会有所不同)

sourcefolder = (r"C:\User\Desktop\Test")
subfolders = 3 
for i in range(subfolders):
    Lst_All["allfiles" + str(i)] = os.listdir(sourcefolder[i])

这会产生下面的字典:

Lst_All = {
           allfiles0: ('A.1.txt', 'A.txt', 'rejected.txt')
           allfiles1: ('B.txt')
           allfiles2: ('C.txt')}

我的问题是删除被拒绝的文件,这样我就可以只使用有效文件进行shutil.move()

到目前为止,我得到了:

for k, v in lst_All.items():
    for i in v:
        if i == "rejected.txt":
            del lst_All[i]

但它返回一个错误 KeyError: 'rejected.txt'。有什么想法吗?也许另一种方法来创建要移动的项目列表?

谢谢!

【问题讨论】:

  • del lst_All[i] 正在从 lst_All 中删除键,而不是从元组值中删除项。
  • 不要使用元组!在 ('B.txt') 的情况下,您循环的是字符而不是项目

标签: python list dictionary tuples python-os


【解决方案1】:

首先,您的字典成员是tuples,而不是lists。元组是不可变的,所以我们不能像使用列表那样容易地删除项目。要复制我认为您所追求的功能,我们可以执行以下操作:

Lst_All = {'allfiles0': ('A.1.txt', 'A.txt', 'rejected.txt'),
          'allfiles1': ('B.txt',),
           'allfiles2': ('C.txt',)}

Lst_All = {k: tuple(x for x in v if x!="rejected.txt") for k, v in Lst_All.items()}

这给了我们:

>>> Lst_All
{'allfiles0': ('A.1.txt', 'A.txt'),
 'allfiles1': ('B.txt',),
 'allfiles2': ('C.txt',)}

【讨论】:

    【解决方案2】:

    从循环内的字典中删除元素时,不应遍历字典。最好制作一个键列表,然后对其进行迭代。此外,您不需要单独的循环来检查该目录中是否存在rejected.txt

    keys = list(lst_All.keys())
    for k in keys:
        if "rejected.txt" in lst_All[k]:
            del lst_All[k]
    

    如果您想删除rejected.txt,那么您只能创建另一个没有该元素的元组并使用键插入字典中。你可以这样做 -

    keys = list(lst_All.keys())
    for k in keys:
        lst_All[k] = tuple((e for e in lst_All[k] if e != 'rejected.txt'))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-27
      • 2020-03-23
      • 2016-05-10
      • 1970-01-01
      • 2020-02-20
      • 1970-01-01
      • 2011-03-14
      相关资源
      最近更新 更多