3

给定以下列表:

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

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

我尝试list()在 if 语句中使用该命令,检查“B​​ox”的所有字符是否都在 内 list2,但似乎它必须更复杂一些。

4

4 回答 4

2

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

# 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 循环。)我将把它留给您推理并确定您是否感兴趣。

于 2012-09-07T07:27:55.453 回答
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)……你明白了。

于 2012-09-07T08:19:33.160 回答
0

这样做怎么样:

  1. 获取所有唯一字符的列表list2,我们称之为charlist
  2. 遍历list1,如果 in 中的任何字符list2不在 in 中charlist,则将它们分开。

第 1 部分:

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

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

对于第 2 部分:

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

使用列表推导然后计算结果的长度,我们可以找出有多少个字母 fromcharlist不在 from 的单词中list1

于 2012-09-07T07:33:34.517 回答
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
于 2012-09-07T07:37:48.880 回答