【问题标题】:Matching list elements with element of tuple in list of tuples将列表元素与元组列表中的元组元素匹配
【发布时间】:2018-04-15 06:07:24
【问题描述】:

我有一个包含字符串的列表:

lst = ['a', 'a', 'b']

实际上,每个字符串都是语料库的一个类别,我需要一个与该类别索引对应的整数列表。

为此,我构建了一个元组列表,其中包含每个(唯一)类别及其索引 f.ex:

catlist = [(0, 'a'), (1, 'b')]

我现在需要遍历第一个字符串列表,如果元素匹配元组的任何第二个元素,则将元组的第一个元素返回到数组,如下所示:

[0, 0, 1]

现在我有

catindexes = []
for item in lst:
    for i in catlist:
        if cat == catlist[i][i]:
            catindexes.append(i)

但这显然不起作用,我无法找到解决方案。 任何提示将不胜感激。

【问题讨论】:

    标签: python list tuples


    【解决方案1】:

    大列表的有效方法:

    第 1 步:构建好的词典。

    d=dict((v,k) for (k,v) in catlist)
    

    第 2 步:使用它。

    [d[k] for k in lst]
    

    这样执行时间会像len(lst) + len(catlist) 一样增长,而不是 len(lst) x len(catlist).

    【讨论】:

      【解决方案2】:

      您可以从catlist 创建一个字典(我们称之为d)并将其反转。现在,对于lst 中的每个元素i,您要查找的是d[i]

      d = {v: k for k, v in catlist}
      res = [d[i] for i in lst]
      

      输出:

      >>> lst = ['a', 'a', 'b']
      >>> d = {v: k for k, v in catlist}
      >>> d
      {'a': 0, 'b': 1}
      >>>
      >>> res = [d[i] for i in lst]
      >>> res
      [0, 0, 1]
      

      【讨论】:

        【解决方案3】:

        条件定义在 if 块不正确。

        试试这个..

        lst = ['a', 'a', 'b']
        catlist = [(0, 'a'), (1, 'b')]
        
        
        catindexes = []
        for item in lst:
            for i in catlist:
                if i[1]==item:
                    catindexes.append(i[0]);
        
        print catindexes
        

        【讨论】:

          【解决方案4】:
          >>> lst = ['a', 'a', 'b']
          >>> catlist = [(0, 'a'), (1, 'b')]
          >>> catindexes = []
          >>> for item in lst:
          ...     for i in catlist:
          ...       if i[1] == item:
          ...         catindexes.append(i[0])
          ...
          >>> catindexes
          [0, 0, 1]
          

          在迭代过程中,i 是对catlist 元素的直接引用,而不是它的索引。我没有使用ilst 中提取元素,for ... in ... 已经解决了这个问题。由于i 是对元组的直接引用,我可以简单地提取相关字段进行匹配和附加,而无需弄乱lst 的索引。

          【讨论】:

            【解决方案5】:

            你已经接近了,在迭代内部循环之后,你应该检查来自外部循环的项目是否实际上等于 tup[1](每个 tup 代表 (0, 'a')(1, 'b') 例如)。

            如果它们相等,只需将 tup (tup[0]) 中的第一个元素附加到结果列表中。

            lst = ['a', 'a', 'b']
            
            catlist = [(0, 'a'), (1, 'b')]
            
            catindexes = []
            for item in lst:
                for tup in catlist:
                    if item == tup[1]:
                        catindexes.append(tup[0])
            print (catindexes)
            

            您也可以使用列表推导:

            catindexes = [tup[0] for item in lst for tup in catlist if tup[1] == item]
            

            【讨论】:

            • 你是对的。谢谢你的解释!这显然是我方面缺乏经验:)
            【解决方案6】:

            我建议您使用 dictionary 代替您的 catlist。我认为它更自然地适合您尝试做的事情:

            lst = ['a', 'a', 'b']
            catdict = {'a': 0, 'b': 1}
            res = [catdict[k] for k in lst]  # res = [0, 0, 1]
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-06-15
              • 2021-08-18
              • 2016-12-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多