【问题标题】:list and elements comparison python列表和元素比较python
【发布时间】:2015-11-07 06:26:19
【问题描述】:
list1 = ['A','B']
list2 = ['a','c']
list3 = ['x','y','z']
list4 = [['A','b','c'],['a','x'],['Y','Z'],['d','g']]

我想检查列表 (list1, list2, list3) 的所有元素是否包含在另一个更大列表 (list4) 中的任何列表中。

我希望比较不区分大小写。

可以肯定的是,这里 list1 和 list2 在 list4 中,但不在 list3 中。我该怎么做?

另一方面,我怎么知道一个列表是否是列表的集合。

换句话说,如果我不是定义列表的人,我如何区分列表是否是仅包含元素列表的列表的集合。

【问题讨论】:

    标签: python list comparison subset


    【解决方案1】:

    第一项 - 您想要进行不区分大小写的匹配。最好的方法是将所有内容转换为一种情况(大写或小写)。所以对于每个列表,运行

    list1 = map(lambda x: x.lower(), list1)
    

    这会将您的列表转换为小写。假设您已经这样做了。

    其次,对于两个“简单”列表(非嵌套)的比较,您可以简单地说

    if set(list1) < set(list2):
    

    比较 list1 是否是 list2 的子集。在您的示例中,这将是错误的。

    最后,如果要检查列表是否嵌套:

    if ( type(list4[0]) == list) :
    

    在这种情况下,这将是正确的。然后,只需遍历 list4 的元素并进行上面的集合比较。

    【讨论】:

      【解决方案2】:

      您可以使用lower() 将所有列表的所有元素设为小写以实现不区分大小写。

      def make_case_insensitive(lst):
          return [i.lower() for i in lst]
      

      例如,

      list1=make_case_insensitive(list1)
      

      由于 biglist 略有不同(包含列表作为元素),您必须稍微更改功能。

      def make_bigger_list_caseinsensitive(bigger_list):
          return [[i.lower() for i in element] for element in bigger_list]
      
      list4=make_bigger_list_caseinsensitive(list4)
      

      检查较大列表的任何元素是否是较小集合的超集。如果条件满足则打印在更大的列表中,否则打印不在更大的列表中。首先从list 生成set

      print "Is in bigger list" if any(set(element).issuperset(set(list1)) for element in list4) else "not in biggger list"
      

      要编写它的可读性略高,请执行以下操作:

      if any(set(element).issuperset(set(list1)) for element in list4):
          print "Is in bigger list"
      else:
          print "not in biggger list"
      

      最后,检查更大列表中是否存在嵌套列表:

      print any(type(element)==list for element in list4)
      

      【讨论】:

        【解决方案3】:

        使用set 是一个好方法。

        list1 = ['A','B']
        list2 = ['a','c']
        list3 = ['x','y','z']
        list4 = [['A','b','c'],['a','x'],['Y','Z'],['d','g']]
        
        set1 = set(map(lambda s: s.lower(), list1))
        set2 = set(map(lambda s: s.lower(), list2))
        set3 = set(map(lambda s: s.lower(), list3))
        set4 = map(lambda l: set(map(lambda s: s.lower(), l)), list4)
        
        print(set1) # set(['a', 'b'])
        print(set2) # set(['a', 'c'])
        print(set3) # set(['y', 'x', 'z'])
        print(set4) # [set(['a', 'c', 'b']), set(['a', 'x']), set(['y', 'z']), set(['d', 'g'])]
        
        lor = lambda x, y: x or y
        
        reduce(lor, map(lambda s: set1.issubset(s), set4)) # True
        reduce(lor, map(lambda s: set2.issubset(s), set4)) # True
        reduce(lor, map(lambda s: set3.issubset(s), set4)) # False
        
        • 要进行不区分大小写的字符串比较,请将两个字符串转换为小写或大写。
        • 要测试list1 中的所有元素都包含在list4 中,请使用set.issubset

        【讨论】:

          猜你喜欢
          • 2015-08-01
          • 2020-09-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多