在常规列表和生成器列表上运行函数

时间:2019-06-12 19:31:14

标签: python python-3.x

我有两个列表:

l1 = ['a','b','c','d','e','f','g','h', ...]

l2 = ['dict1','dict2','dict3','dict4','dict5','dict6','dict7','dict8', ...]

我需要一次在每个列表中的50个项目的块上运行一个函数,直到该函数返回每个列表中前50个项目的结果,它才能继续运行。

我的第一个想法是使用发电机:

def list1_split(l1):
    n = 50
    for i in range(0, len(l1), n):
        yield l1[i:i+n]

def list2_split(l2):
        n = 50
        for i in range(0, len(l2), n):
            yield l2[i:i+n]

chunk_l1 = list1_split(l1)
chunk_l2 = list1_split(l1)

然后在同时使用两个列表时,我将它们放在主函数中:

def query(chunk_l1, chunk_l2):

    count = 0
    query_return_dict = {}

    for i, j in zip(chunk_l2, chunk_l1):
        count += 1
        query_return_dict[i] = j
        print('This is number ', count, '\n', j)

    return query_return_dict


def main():
    thread = threading.Thread(target=query(chunk_l1, chunk_l2))
    thread.start()

    print('Done!')

if __name__ == '__main__':
    main()

我遇到的第一个错误与生成器无关(我认为):

TypeError: 'dict' object is not callable

但是真正让我失望的是,当我使用调试器时,我的for循环将每个列表解释为:

i: <class 'list'>: ['a','b','c','d','e',...]
j: <class 'list'>: ['dict1','dict2','dict3','dict4',...]

除了i: 'a', j: 'dict1'之外,我还收到一条错误消息,

TypeError: unhashable type: 'list'

我对生成器不太熟悉,但是似乎对于一次运行一个块最有用

1 个答案:

答案 0 :(得分:3)

首先,ij不是您可能想到的字符串,而是它们自己列出的字符串。

当您执行query_return_dict[i]时,会收到错误TypeError: unhashable type: 'list',因为您试图将列表用作字典键,但是您不能这样做,因为列表是可变的,因此无法哈希,因此字典键应该总是可哈希的

要从列表中提取字符串,您需要另一个for循环,该循环遍历ij并创建您的query_return_dict

def query(chunk_l1, chunk_l2):

    query_return_dict = {}

    #i and j are chunks
    for i, j in zip(chunk_l1, chunk_l2):
        #Zip chunks together to extract individual elements
        for key, value in zip(i, j):
            #Create your dictionary
            query_return_dict[key] = value

thread = threading.Thread(target=query(chunk_l1, chunk_l2))也不是您将函数作为目标传递给线程的方法,而是您想这样做

thread = threading.Thread(target=query, args=(chunk_l1, chunk_l2))

从文档中:https://docs.python.org/3/library/threading.html#threading.Thread

  

target是run()方法要调用的可调用对象。默认为None(无),表示什么都不叫。
  args是目标调用的参数元组。默认为()。