【问题标题】:Cross Referencing Lists in PythonPython 中的交叉引用列表
【发布时间】:2015-10-26 05:52:01
【问题描述】:

我正在尝试创建一个函数,该函数接受输入,将该输入与列表列表进行比较,然后从另一个列表中返回具有相同数量对象的项目。

例子:

list_1=[[1,2,3],[4,5],[6,7,8]]

list_2=['a','b','c']
  • 如果 input 是 1、2 或 3 函数返回 'a'

  • 如果 input 是 4 或 5 函数返回 'b'

  • 如果input 为6、7 或8 函数返回'c'

我是python的新手,一直在思考这个问题,并四处寻找没有结果的线索。任何可能帮助我解决这个问题的提示/线索将不胜感激!谢谢!

【问题讨论】:

  • 这些数字总是一样吗?它们是静态变量吗?
  • 在这种情况下,列表将包含静态变量。

标签: python list python-2.7 python-3.x for-loop


【解决方案1】:

为了更加灵活,您可以在函数的开头制作一个字母列表(至少对于本示例而言)。

def crossRef(inList, inputNum):
    alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
                'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 
                's', 't', 'u', 'v', 'w', 'x', 'y', 'z']

    i = 0
    for listItem in inList:
        if inputNum in listItem:
            return alphabet[i]
        i += 1
    return None

【讨论】:

    【解决方案2】:

    功能:

    def find_list_two_value(value, list_1, list_2):
        for i in list_1:
            if value in i:
                return list_2[list_1.index(i)]
        return none
    

    注意:您可能需要为其添加一些错误处理。 Index Error

    试运行:

    list_1 = [[1,2,3],[4,5],[6,7,8]]
    list_2 = ['a','b','c']
    print find_list_two_value(6, list_1, list_2)
    
    output: c
    

    文档: For loop

    【讨论】:

    • 这很好。我从输入中删除了 list_1 和 list_2 并在全局范围内定义了它们。我还打算在您的笔记中添加错误处理。谢谢!
    【解决方案3】:

    zip 是一个组合(“压缩在一起”)列表的函数。

    它将从每个列表中生成对:

    >>> combined = zip(list_1, list_2)
    [([1, 2, 3], 'a'), ([4, 5], 'b'), ([6, 7, 8], 'c')]
    >>> test_key = 5
    >>> for keys, value in combined:
    ...     if test_key in keys:
    ...          print value
    'b'
    

    额外的预处理可以让您直接查找值。例如,您可以将给定值(来自第二个列表)的所有键(来自第一个列表)写入dict

    >>> value_dict = {}
    >>> for keys, value in combined:
    ...     for key in keys:
    ...         value_dict[key] = value
    >>> value_dict
    {1: 'a', 2: 'a', 3: 'a', 4: 'b', 5: 'b', 6: 'c', 7: 'c', 8: 'c'}
    >>> value_dict[5]
    'b'
    >>> value_dict.get(42, "not found")
    "not found"
    

    【讨论】:

      【解决方案4】:

      这应该可以满足您的需求:

      def crossReferenceInLists(input, list1, list2):
          for index, item in enumerate(list1):
              if input not in item:
                  continue
      
              try:
                  return list2[index]
              except IndexError:
                  return None
      
          return None
      
      
      print(crossReferenceInLists(2, [[1, 2, 3], [4, 5], [6, 7, 8]], ['a', 'b', 'c']))
      print(crossReferenceInLists(7, [[1, 2, 3], [4, 5], [6, 7, 8]], ['a', 'b', 'c']))
      

      $ python so.py

      一个

      c

      【讨论】:

        【解决方案5】:

        您可以遍历list_1 中的每个列表并检查输入是否在一个中。如果是,则可以打印list_2的对应索引(假设它仅由单个值组成),通过在循环中使用枚举获得。

        input = 1
        for idx,i in enumerate(list_1):
            if input in i:
                return list_2[idx]
        

        在这种情况下,我返回了'a'

        【讨论】:

        • 这太棒了!非常简洁,完全符合我的想法。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-20
        • 1970-01-01
        • 2021-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多