调用参数每次迭代都会改变的函数 [python]

时间:2021-02-14 16:36:27

标签: python json list dictionary

对于 Python 专家来说,这可能是一项简单的任务。这是我的问题:我需要过滤一个列表,通过另一个包含字典的列表列表(它们是三个列表)保存为 json 数组。因此,我编写了一个具有理解列表的函数来获取过滤列表并调用这个列表三次。问题是在每次迭代中,要过滤的列表必须是通过调用我的函数获得的最新列表,但实际情况是在每次迭代中,我的函数总是传递要过滤的原始列表。因此它没有正确过滤掉。问题是第一次迭代后的第一个参数(lst_to_be_filter)应该是第一个过滤器的结果,而不是始终是原始列表。我将举一个我想要得到的例子:

list to be filtered: 
[{"k1": 1235421901, "k2": ""}, {"k1": 729291349, "k2": "Aff"}, {"k1": 741952108, "k2": "rewuie"}]

list of lists:
[[{"k1": 1235421901, "k2": ""}, {"k1": 459291349, "k2": "eijie"}],[{"k1": 1235421901, "k2": ""}, {"k1": 948521901, "k2": "vnvju"}, {"k1": 234121901, "k2": "ppp"}], [{"k1": 935591901, "k2": "sòdodo"}, {"k1": 100021901, "k2": "ju"}, {"k1": 741952108, "k2": "rewuie"}]]


final result: [{"k1": 729291349, "k2": "Aff"}]

因此,在第一次迭代之后,我的功能删除了一个字典,在第二个没有任何内容,在第三次迭代中删除另一个字典,因此我的最终列表只有一个我必须保存为文件的字典。 在我的代码下方:

import json

#Function creating the filtered list
def filterlist(l_all, l_admin):
    l_filtered = [j for j in l_all if j not in l_admin]
    with open('userstofiltered.txt', 'r+', encoding='utf-8') as r6:
        json.dump(l_filtered,r6)
    return l_filtered

list_filtered = list()
listofUsers = list()  # list of lists of dictionaries
with open('fil1.txt', 'r', encoding='utf-8') as r1, \
        open('fil2.txt', 'r', encoding='utf-8') as r2, \
        open('file3.txt', 'r', encoding='utf-8') as r3, \
        open('fullList.txt', 'w', encoding='utf-8') as r4, \
        open('userstofiltered.txt', 'r+', encoding='utf-8') as r5:
    lst_to_be_filter = json.load(r5)
    print("Pre filter:Num. users", len(lst_to_be_filter))
    print("users", lst_to_be_filter)
    #Create list of lists named (listofUsers )
    l1 = json.load(r1)
    listofUsers.append(l1)
    l2 = json.load(r2)
    listofUsers.append(l2)
    l3 = json.load(r3)
    listofUsers.append(l3)
    json.dump(listofUsers, r4)

for x in range(0,len(listofUsers)):
    list_filtered = filterlist(lst_to_be_filter, listofUsers[x])

1 个答案:

答案 0 :(得分:1)

IIUC,您可以在 list_filtered 循环之前使用 for 初始化 lst_to_be_filter 并始终将 list_filtered 传递给函数,如下所示:

list_filtered = lst_to_be_filter
for x in range(0,len(liste_tipster)):
    list_filtered = filterlist(list_filtered, listofUsers[x])

然后每次迭代都会更新。