处理字典中的列表

Dealing with lists in a dictionary

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

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]

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

谢谢!

首先,您字典的成员是 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',)}

在循环内从字典中删除元素时,不应遍历字典。最好制作一个键列表,然后对其进行迭代。此外,您不需要单独的循环来检查 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'))