检查字符串列表中的字符是否是另一个字符串列表中字符的子集

时间:2012-09-07 06:44:14

标签: python python-2.7

鉴于以下清单:

list1 = ["Box", "Stall"]
list2 = ["Ball", "Sox"]

如何检查组成'Ball'和'Sox'的所有字符('BallSox')是否包含在'BoxStall'中(构成'Box'和'Stall'的字符)?他们是谁。它必须区分大小写。

我尝试在if语句中使用list()命令,检查'Box'的所有字符是否都在list2内,但似乎它必须更复杂一点

4 个答案:

答案 0 :(得分:1)

我认为没有内置函数可以处理这个问题。你能做的是

# put all characters of first list into a dictionary 
# object.  This is easier to use for looking up characters
# later
list_chars = {}
for string in list1:
    for char in string:
        list_chars[char] = True


# run through second list, for each character
# in the other list, check if it exists in
# the dictionary of characters from the first 
# list.  If it does not, then set missing_character to True.
missing_character = False
for string in list2:
    for char in string:
        if not list_chars.get(char,False):
            # means that the first list does
            # not contain the character char
            missing_character = True


# print whether one list was actually missing a character.
if missing_character:
   print('Missing some character!')
else
   print('Contained all characters!')

如果以上某些部分没有意义,请随意提出跟进问题。此外,如果您使用上面的break语句,您可以使上面的代码更快一些。 (如果你已经知道列表缺少一个字符,请尽早退出for循环。)我会留下你的理由,并弄清楚你是否感兴趣。

答案 1 :(得分:0)

这样做怎么样:

  1. 获取list2中所有唯一字符的列表,我们称之为charlist
  2. 浏览list1,如果list2中的字词中的任何字符不在charlist中,请将它们分开。
  3. 第1部分:

    >>> charset = set(''.join(i for i in list2))
    >>> charset
    set(['a', 'B', 'l', 'o', 'S', 'x'])
    

    set是一种不允许重复的特殊类型;每个项目都必须是唯一的。

    第2部分:

    >>> characters_missing = [x for x in ''.join(list1) if x not in charlist]
    >>> len(characters_missing)
    0
    

    使用list comprehension然后计算结果的长度,我们可以找出来自charlist的单词中来自list1的字母数。

答案 2 :(得分:0)

我认为内置join函数可以提供有效的解决方案:

>>> list1 = ["Box", "Stall"]
>>> list2 = ["Ball", "Sox"]
>>> def chars_subset(l1, l2):
    s1 = "".join(l1)
    s2 = "".join(l2)
    return not bool([c for c in s2 if c not in s1])

>>> chars_subset(list1, list2)
True
>>> list2 = ["Ball", "Soy"]
>>> chars_subset(list1, list2)
False

答案 3 :(得分:0)

检查一组元素是否包含另一组元素的自然方法是使用内置set

  • 首先,构建list1

    项目中包含的所有字母的集合
    target = set()
    for item in list1:
        target |= set(item)
    

    请注意,我们正在使用|=运算符更改我们的设置。我们也可以将集合的构造放在一行:

    import operator
    target = reduce(operator.or_, (set(i) for i in list1)
    
  • 现在,我们必须迭代list2并检查每个项目的字母是否包含在集合中:

    for item in list2:
        if target.issuperset(item):
            print "item {0} passed the test".format(item)
        else:
            print "item {0} failed the test".format(item)
    

    您可以构建与此测试相对应的布尔值列表:

    valid = [target.superset(i) for i in list2]
    

    并检查所有元素是否通过all(valid)的测试,或者至少有一个元素使用any(valid) ...您明白了。