我有两个列表:
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'
我对生成器不太熟悉,但是似乎对于一次运行一个块最有用
答案 0 :(得分:3)
首先,i
和j
不是您可能想到的字符串,而是它们自己列出的字符串。
当您执行query_return_dict[i]
时,会收到错误TypeError: unhashable type: 'list'
,因为您试图将列表用作字典键,但是您不能这样做,因为列表是可变的,因此无法哈希,因此字典键应该总是可哈希的
要从列表中提取字符串,您需要另一个for循环,该循环遍历i
和j
并创建您的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是目标调用的参数元组。默认为()。