python在多个循环中迭代多个列表

时间:2013-12-24 20:24:06

标签: 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)

是否有一种有效的方法进行上述计算。非常感谢。

3 个答案:

答案 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)

记住新信息时:

  1. list1的元素格式为(name, last_name, gender, job_class, salary)
  2. list2包含(name, last_name, increase)形式的元素(可能是一个人的加薪),
  3. list3包含(job_class, bonus)
  4. 等元素

    ...使用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
    

    任何不可变类型(例如strinttuple)都可以用作dict中的键,类似于用于{的{0}整数{1}}。请注意,list可以更改(例如使用list)并且是“可变的”;因此list.append不能成为关键。有关list的详细信息,请阅读documentation

答案 2 :(得分:1)

就时间和内存效率而言,当前代码似乎最为理想。您必须相互检查list1list2的所有元素,以便进行比较。
消除一些重复的“错误”情况的一个补充是在两个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)