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