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