鉴于以下清单:
list1 = ["Box", "Stall"]
list2 = ["Ball", "Sox"]
如何检查组成'Ball'和'Sox'的所有字符('BallSox')是否包含在'BoxStall'中(构成'Box'和'Stall'的字符)?他们是谁。它必须区分大小写。
我尝试在if语句中使用list()
命令,检查'Box'的所有字符是否都在list2
内,但似乎它必须更复杂一点
答案 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)
这样做怎么样:
list2
中所有唯一字符的列表,我们称之为charlist
list1
,如果list2
中的字词中的任何字符不在charlist
中,请将它们分开。第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)
...您明白了。