列表理解比较两个不同的列表

时间:2019-12-16 14:25:03

标签: python list-comprehension

我有两个命名管A和B列表。命名字段是名称,城市,河流,州,公园,学校等。 如果A中的元素和B中的元素匹配,我需要返回一个更新的元组。这是我的代码:

def update_values(A, B):
    ''' update A fields with B fields
    '''
    for n, a in enumerate(A):
        for b in B:
            if a.name == b.name :
                a = a._replace(city = b.city, state = b.state, river=b.river)
                A[n] = a
                break
    return A

我想知道是否还有更多的Python方式可以做到这一点,可能是列表理解。

3 个答案:

答案 0 :(得分:2)

这应该有效:

def update_values(A, B):
  Bs = { b.name: b for b in B }
  return [ a if a.name not in Bs else a._replace(city=Bs[a.name].city, state=Bs[a.name].state, river=Bs[a.name].river) for a in A ]

答案 1 :(得分:1)

无论是否使用列表理解,都应使用将名称映射到async function pageFunction(context) { const { jQuery: $, waitFor, saveSnapshot } = context; $('#fc_id_aerztinnen_-_aerzte').click(); await waitFor(1000); await saveSnapshot(); } 中的元素的字典,而不要使用内部循环:

B

但是,这将使转换为列表理解更加困难,因为您每次都必须在def update_values(A, B): b_by_name = {b.name: b for b in B} for n, a in enumerate(A): if a.name in b_by_name: b = b_by_name[a.name] A[n] = a._replace(city = b.city, state = b.state, river=c.river) return A 中重复查找。 (计算上不是问题,但阅读起来并不好。)相反,您可以使用第二个“循环”,仅用于将该值绑定到b_by_name

b

答案 2 :(得分:1)

您可以尝试为B构建字典,该字典首先包含必要的替换值,然后使用get实现快速检索并将结果解压缩到a._replace方法中。

def update_values(A, B):
    b_dict = {b.name: {k: getattr(b, k) for k in ('city', 'state', 'river')} for b in B}
    return [a._replace(**b_dict.get(a.name, {})) for a in A]

假设您有这样的数据样本:

>>> B
[City(name='Name1', city='City1', state='State1', river='River1', street='Street1'),
 City(name='Name2', city='City2', state='State2', river='River2', street='Street2'),
 City(name='Name3', city='City3', state='State3', river='River3', street='Street3'),
 City(name='Name4', city='City4', state='State4', river='River4', street='Street4'),
 City(name='Name5', city='City5', state='State5', river='River5', street='Street5'),
 City(name='Name6', city='City6', state='State6', river='River6', street='Street6'),
 City(name='Name7', city='City7', state='State7', river='River7', street='Street7'),
 City(name='Name8', city='City8', state='State8', river='River8', street='Street8'),
 City(name='Name9', city='City9', state='State9', river='River9', street='Street9'),
 City(name='Name10', city='City10', state='State10', river='River10', street='Street10'),
 City(name='Name11', city='City11', state='State11', river='River11', street='Street11'),
 City(name='Name12', city='City12', state='State12', river='River12', street='Street12'),
 City(name='Name13', city='City13', state='State13', river='River13', street='Street13'),
 City(name='Name14', city='City14', state='State14', river='River14', street='Street14'),
 City(name='Name15', city='City15', state='State15', river='River15', street='Street15')]

>>> A
[City(name='Name16', city='__C16', state='__S16', river='__R16', street='__ST16'),
 City(name='Name10', city='__C10', state='__S10', river='__R10', street='__ST10'),
 City(name='Name11', city='__C11', state='__S11', river='__R11', street='__ST11'),
 City(name='Name17', city='__C17', state='__S17', river='__R17', street='__ST17'),
 City(name='Name18', city='__C18', state='__S18', river='__R18', street='__ST18'),
 City(name='Name19', city='__C19', state='__S19', river='__R19', street='__ST19'),
 City(name='Name20', city='__C20', state='__S20', river='__R20', street='__ST20'),
 City(name='Name21', city='__C21', state='__S21', river='__R21', street='__ST21'),
 City(name='Name12', city='__C12', state='__S12', river='__R12', street='__ST12'),
 City(name='Name13', city='__C13', state='__S13', river='__R13', street='__ST13'),
 City(name='Name22', city='__C22', state='__S22', river='__R22', street='__ST22'),
 City(name='Name14', city='__C14', state='__S14', river='__R14', street='__ST14'),
 City(name='Name15', city='__C15', state='__S15', river='__R15', street='__ST15'),
 City(name='Name23', city='__C23', state='__S23', river='__R23', street='__ST23'),
 City(name='Name24', city='__C24', state='__S24', river='__R24', street='__ST24')]

运行上述功能将使您:

>>> update_values(A, B)
[City(name='Name16', city='__C16', state='__S16', river='__R16', street='__ST16'),
 City(name='Name10', city='City10', state='State10', river='River10', street='__ST10'),
 City(name='Name11', city='City11', state='State11', river='River11', street='__ST11'),
 City(name='Name17', city='__C17', state='__S17', river='__R17', street='__ST17'),
 City(name='Name18', city='__C18', state='__S18', river='__R18', street='__ST18'),
 City(name='Name19', city='__C19', state='__S19', river='__R19', street='__ST19'),
 City(name='Name20', city='__C20', state='__S20', river='__R20', street='__ST20'),
 City(name='Name21', city='__C21', state='__S21', river='__R21', street='__ST21'),
 City(name='Name12', city='City12', state='State12', river='River12', street='__ST12'),
 City(name='Name13', city='City13', state='State13', river='River13', street='__ST13'),
 City(name='Name22', city='__C22', state='__S22', river='__R22', street='__ST22'),
 City(name='Name14', city='City14', state='State14', river='River14', street='__ST14'),
 City(name='Name15', city='City15', state='State15', river='River15', street='__ST15'),
 City(name='Name23', city='__C23', state='__S23', river='__R23', street='__ST23'),
 City(name='Name24', city='__C24', state='__S24', river='__R24', street='__ST24')]