我需要迭代多个列表,并为匹配记录做一些计算:
for (a,b,c,d) in list1:
for (a2,b2,e) in list2:
if (a==a2) and (b==b2):
mylist.add(a,b,c,d,e,d*e)
是否有一种有效的方法进行上述计算。非常感谢。
答案 0 :(得分:5)
构建一些字典以便快速查找:
data1 = {(a, b): (c, d) for a, b, c, d in list1}
data2 = {(a, b): e for a, b, e in list2}
result = []
for a, b in set(data1) & set(data2):
c, d = data1[a, b]
e = data2[a, b]
result.append((a, b, c, d, e, e*d))
答案 1 :(得分:2)
记住新信息时:
list1
的元素格式为(name, last_name, gender, job_class, salary)
,list2
包含(name, last_name, increase)
形式的元素(可能是一个人的加薪),list3
包含(job_class, bonus)
, ...使用dict
可以使性能和代码清晰度都受益。
使用(first,last)
形式的元组来引用程序中的每个人,您可以执行以下操作(在input
的基本示例中获取信息):
people = dict()
for i in range(num_ppl):
name = tuple(input().split()) # input is something like "Bob Smith"
people[name] = getPeopleInfo() # read gender, job_class, salary, etc. and make a list
for i in range(num_raises):
first, last, increase = input().split()
people[(first,last)][-1] *= float(increase)
for i in range(num_bonuses):
job_class, bonus = input().split()
for name in people: # iterating through a dict gives the keys (similar to indices of a list, but can be immutable types such as tuples)
if people[name][2] == job_class:
people[name][-1] += bonus
任何不可变类型(例如str
,int
和tuple
)都可以用作dict
中的键,类似于用于{的{0}整数{1}}。请注意,list
可以更改(例如使用list
)并且是“可变的”;因此list.append
不能成为关键。有关list
的详细信息,请阅读documentation。
答案 2 :(得分:1)
就时间和内存效率而言,当前代码似乎最为理想。您必须相互检查list1
和list2
的所有元素,以便进行比较。
消除一些重复的“错误”情况的一个补充是在两个for
循环线之间添加:
if a != b: # none of the items in list2 will satisfy a==b2 and b==b2
continue
您也可以在Python中使用if a == b == b2
,而不必将语句与and
绑定在一起。
根据您的记录的存储和访问方式,您可能会因使用dict
而非list
而受益。 dict
可以判断某个实现的示例是否为:
lookup = dict()
# when adding an item to what would be list2
if b2 in not in lookup:
lookup[b2] = []
lookup[b2].append((a2,e))
# ...
for (a,b,c,d) in list1:
if a == b and a in lookup:
for (a2,e) in lookup[a]:
mylist.add(a,b,c,d,e,d*e)