python在多个循环中迭代多个列表
我需要遍历多个列表,并对匹配的记录进行一些计算:python在多个循环中迭代多个列表,python,list,loops,Python,List,Loops,我需要遍历多个列表,并对匹配的记录进行一些计算: 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) 是否有一种有效的方法进行上述计算。非常感谢 就时间和内存效率而言,当前代码似乎大多是最优的。您必须检查list1和list2的所有元素,以便进行比较。 消除重复出现的“错误”情况的一个补充是在两条循环线之间添加
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)
是否有一种有效的方法进行上述计算。非常感谢 就时间和内存效率而言,当前代码似乎大多是最优的。您必须检查
list1
和list2
的所有元素,以便进行比较。消除重复出现的“错误”情况的一个补充是在两条
循环线之间添加:
if a != b: # none of the items in list2 will satisfy a==b2 and b==b2
continue
如果a==b==b2,也可以在Python中使用,而不必将语句与和绑定在一起
根据记录的存储和访问方式,使用dict
s而不是list
s可能会使您受益匪浅。一个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)
构建一些字典以进行快速查找:
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))
考虑到新的信息,我们认为:
list1
的元素的形式为(姓名、姓氏、性别、职务、级别、薪水)
list2
is包含表单元素(姓名、姓氏、加薪)
(可能是一个人的加薪)
list3
具有类似于(工作、职业、奖金)
。。。使用dict
,您可能会在性能和代码清晰度方面受益
使用(first,last)
格式的元组引用程序中的每个人,您可以执行类似的操作(在一个使用输入
获取信息的基本示例中):
任何不可变类型,如str
、int
和tuple
都可以用作dict
中的键,类似于用于列表的基于0的整数。请注意,列表
可以更改(例如,使用list.append
)并且是“可变的”;因此,列表
不能是键。有关dict
的更多信息,请阅读。给我们一个列表外观的示例。首先,在外部循环“If a!=b:继续`@ColBeseder:我猜目的是如果(a==a2)和(b==b2)
,但我同意OP应该澄清。列表可能看起来像列表1=(姓名,姓氏,性别,职业,薪水)列表2=(姓名,姓氏,加薪)并假设还有一个列表,列表3=(职业,奖金)所以需要找到所有匹配的记录,因此,您似乎在工作中使用了错误的数据结构。请显示一些实际代码和一些实际数据。请小心,如果a==a2和b==b2:
,则应该是-问题中有一个输入错误,但注释表明了这一点。列表可能看起来像列表1=(姓名、姓氏、性别、职务、级别、薪水)列表2=(姓名、姓氏、加薪)并假设另一个列表,列表3=(职务、级别、奖金)所以需要找到所有匹配的记录,以便列表1中的(姓名、姓氏、性别、工作类别1、薪水)列表2中的(姓名2、姓氏2、加薪):如果(姓名==姓名2)和(姓氏==姓氏2):对于列表3中的(工作类别2、奖金)如果(工作类别==工作类别2):最终的名单。添加值得指出的(姓名、姓氏、薪水*增加+奖金),这比问题中关于数千个数据集的实现要慢。@adsmith:真的吗?这不是O(N)对O(N^2)吗?@adsmith:我觉得很难相信。我可以相信,对于非常小的列表,它的速度要慢一些,但是对于中等大小的列表,我认为算法的复杂性必须要赢@Eric:注意,这假设(a,b)
中的所有内容都是唯一的;不是不合理的,但我不清楚这个问题。(不确定OP如何处理两个同名的人,例如。)我为list1
生成了2000个条目的虚拟列表,为list2
生成了1000个条目。有很多重复的条目,所以这可能是导致效率下降的原因。对于实际数据,字典可能提供更快的查找,但是如果没有一些实际数据,测试起来会更困难,我不打算生成2000个大的虚拟数据项来运行timeit
!
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