给定以下列表:
list1 = ["Box", "Stall"]
list2 = ["Ball", "Sox"]
如何检查构成“Ball”和“Sox”的所有字符(“BallSox”)是否包含在“BoxStall”(构成“Box”和“Stall”的字符)中?他们是。它必须区分大小写。
我尝试list()
在 if 语句中使用该命令,检查“Box”的所有字符是否都在 内 list2
,但似乎它必须更复杂一些。
给定以下列表:
list1 = ["Box", "Stall"]
list2 = ["Ball", "Sox"]
如何检查构成“Ball”和“Sox”的所有字符(“BallSox”)是否包含在“BoxStall”(构成“Box”和“Stall”的字符)中?他们是。它必须区分大小写。
我尝试list()
在 if 语句中使用该命令,检查“Box”的所有字符是否都在 内 list2
,但似乎它必须更复杂一些。
我不认为有一个内置函数可以处理这个问题。你能做的是
# 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 循环。)我将把它留给您推理并确定您是否感兴趣。
检查一组元素是否包含另一组元素的自然方法是使用内置的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)
……你明白了。
这样做怎么样:
list2
,我们称之为charlist
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
。
我认为内置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