【问题标题】:Get matching elements' values in two arrays在两个数组中获取匹配元素的值
【发布时间】:2011-10-26 06:11:05
【问题描述】:

如果ab 是对象列表,每个对象都有一个名称属性(例如a1 = A("1")b1 = B("1") 等),我将如何检查等效性?我目前正在这样做:

aList = [ a1, a2, a3, a4, a5 ]
bList = [ b1, b2 ]
aNameList = []
bNameList = []

for i in aList:
    aNameList.append( i.name )
for i in bList:
    bNameList.append( i.name )

match = set(aNameList) & set(bNameList)

>>> set(['1', '2'])

但这似乎有点冗长且不必要。有什么更好的方法来做到这一点?

【问题讨论】:

    标签: python arrays


    【解决方案1】:

    您可以使用列表推导来替换示例中的那些临时列表和 for 循环:

    match = set( [ x.name for x in aList ] ) & set ( [ x.name for x in bList ] )
    

    【讨论】:

    • 感谢您的评论,您的权利...该睡觉了(对于未来的读者,我删除了我的评论)
    • set 将接受生成器,因此方括号是不必要的。
    • @KarlKnechtel 方括号在风格上会更好还是完全没有必要?
    • 我认为摆脱它们在风格上会更好。
    【解决方案2】:

    operator.attrgetter 函数旨在提取感兴趣的字段:

    set(map(attrgetter('name'), aList)) & set(map(attrgetter('name'), bList))
    

    【讨论】:

      【解决方案3】:

      您可以用 map 替换列表理解(替换临时列表和 for 循环) 喜欢:

      name = lambda: n: n[name]
      match = set(map(name,aList))&set(map(name,bList))
      

      【讨论】:

        猜你喜欢
        • 2020-02-23
        • 2018-09-08
        • 1970-01-01
        • 2022-08-11
        • 1970-01-01
        • 2017-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多