【问题标题】:Filtering for tuples from another list and extracting values从另一个列表中过滤元组并提取值
【发布时间】:2018-04-04 11:41:18
【问题描述】:

我正在处理两个元组列表并推断结果。

例如:

A = [('Hi','NNG'),('Good','VV'),...n]
B = [('Happy','VA',1.0),('Hi','NNG',0.5)...n]

首先,我想匹配 A 和 B 之间的单词。 比如'嗨'='快乐'或'嗨'='嗨' 其次,如果它们相同且匹配,则匹配词类。 'NNG'='NNG' 还是 'NNG'='VV' 第三,如果所有这些步骤都匹配,则提取数字! 比如如果 A=[('Hi','NNG')] 和 B=('Hi','NNG',0.5) 提取 0.5

最后,我想将提取中的所有数字相乘。 每个 A、B 中都有 1000 多个元组。因此需要“for”循环来找出这个过程。

如何在 Python 中做到这一点?

【问题讨论】:

  • 有什么你自己试过的吗?进展如何?
  • 2个fors、ifbreak的基本代码有什么问题?
  • 我试过 [x[0] for x in a]。但是如果我比较两个列表,它就不起作用了。
  • @jpp 这些不是特定于版本的问题。请不要添加 Python 3 标签。
  • 哦...我会记住的!

标签: python list tuples


【解决方案1】:

试试这样的:

A = [('Hi', 'NNG'), ('Good', 'VV')]
B = [('Happy', 'VA', 1.0), ('Hi', 'NNG', 0.5)]

print(', '.join(repr(j[2]) for i in A for j in B if i[0] == j[0] and i[1] == j[1]))
# 0.5

【讨论】:

    【解决方案2】:

    一种方法是使用set 和(可选)字典。这种方法的好处是您还可以保留关键数据以了解您的值的来源。

    A = [('Hi','NNG'),('Good','VV')]
    B = [('Happy','VA',1.0),('Hi','NNG',0.5)]
    
    A_set = set(A)
    
    res = {(i[0], i[1]): i[2] for i in B if (i[0], i[1]) in A_set}
    
    res = list(res.values())
    # [0.5]
    

    要将列表中的所有结果相乘,请参阅How can I multiply all items in a list together with Python?

    说明

    • for i in B 使用字典理解。它的作用是返回一个遍历 B 的每个元素的结果元组。
    • 例如,在迭代第一个元素时,会发现i[0] = 'Happy', i[1] = 'VA', i[2] = 1.0
    • 由于我们遍历整个列表,因此我们使用前 2 个元素的元组键构造了一个结果字典。
    • 此外,我们添加条件(i[0], i[1]) in A_set 以根据所需逻辑进行过滤。

    【讨论】:

    • 您能解释一下这是如何工作的吗? res = {(i[0], i[1]): i[2] for i in B if (i[0], i[1]) in A_set} 简述?
    • 谢谢jpp!!真的是最后一个哈哈:)在这里,(i[0], i[1]): i[2]),你用":"i[2]来分隔这个,如果B和A_set相同,那么用. values() 得到 i[2]?
    • 不,这是唯一比较:if (i[0], i[1]) in A_setfor i in B 是单独的逻辑。像英语一样阅读。
    【解决方案3】:

    Python 的水平如此之高,以至于感觉就像是英语。因此,只需最少的经验即可轻松编写以下工作解决方案:

    A = [('Hi','NNG'),('Good','VV')]
    B = [('Happy','VA',1.0),('Hi','NNG',0.5)]
    
    tot = 1
    for ia in A:
        for ib in B:
            if ia == ib[:2]:
                tot *= ib[2]
                break  # remove this line if multiple successful checks are possible
    print(tot)  # -> 0.5
    

    【讨论】:

      【解决方案4】:

      zip()是你的朋友:

      for tupA,tupB in zip(A,B):
          if tupA[:2] == tupB[:2] : print(tupB[2])
      

      使用花哨的pythonic列表理解:

      results = [tubB[2] for tubA,tubB in zip(A,B) if tubA[:2] == tubB[:2] ]
      

      但是……为什么我有一种偷偷摸摸的感觉这不是你想要做的?

      【讨论】:

        猜你喜欢
        • 2016-08-20
        • 1970-01-01
        • 2018-11-24
        • 2020-01-09
        • 2022-07-31
        • 1970-01-01
        • 1970-01-01
        • 2021-06-22
        • 2021-04-04
        相关资源
        最近更新 更多