Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列表理解比较两种不同的列表_Python_List Comprehension - Fatal编程技术网

Python 列表理解比较两种不同的列表

Python 列表理解比较两种不同的列表,python,list-comprehension,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.

我有两个命名域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方法可以做到这一点,可能是列表理解

这应该有效:

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 ]

与是否使用列表理解无关,您应该使用字典将名称映射到
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

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

您可以尝试为
B
构建字典,首先包含必要的替换值,然后使用
get
实现快速检索,并将结果解压缩到
a.\u 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')]

如果可以使用集合(如果对象本身不可散列,则可以使用从名称到对象的字典),则可以在O(1)而不是O(N^2)中完成此操作。您需要首先为b创建字典。否则您将有一个免费的双循环。
a
b
有其他功能吗?如果没有,您可以只做
A[n]=b
而不做
replace
?为什么不提供示例数据,以便我们可以轻松地进行尝试?为什么让我们更难帮助你?我甚至不知道
namedtuple
有一个
\u replace
方法。很高兴知道。我认为a.\u replace(**b_dict.get(a.name,{})将替换太多。否则您可以使用
b_dict.get(a.name,a)
并使用dict(或
a
)中的实际
b
。我尝试了
a.\u replace(**{})
在回答之前,它不会取代任何内容,因此我提出了我的建议。我也考虑了你的建议,但
b
可能不仅仅是
city
state
river
。啊,我没有看到你只是将这些字段存储在
b_dict
中。我喜欢你的理解。如果a和b有同样的结构,可能只是用b替换a:[a如果a.name不在Bs中,那么b[a.name]]@apet这是个好主意,但我们无法检验这个假设(OP没有提供样本数据)。