假设我有一个模式列表和一个字符串列表(等长)。通过比较字符串列表中每个字符串的位置和模式列表中的模式,我需要返回包含所有不匹配字符串的列表列表。这是一个例子
p = ['1', '0', '0', '1']
s = ['Dog', 'Cat', 'Duck', 'Dog']
p是一种模式,此列表所说的是位置索引0和索引3中的项应匹配,位置索引1和索引2中的项应匹配。在这里我们可以看到'狗'和'狗'匹配,但'猫'和'鸭'不匹配。所以回报将是
[['Cat', 'Duck']]
例如,如果字符串为s = ['Dog', 'Cat', 'Cat', 'Dog']
,则返回
[]
更多例子:
p = ['1', '1', '0', '0', '1']
s = ['Red', 'Blue', 'Yellow', 'Yellow', 'Blue']
return将为[['Red', 'Blue', 'Blue']]
,因为索引0,1和4不匹配
p = ['1', '1', '1', '1']
s = ['Red', 'Red', 'Red', 'Green']
返回应为[['Red', 'Red', 'Red', 'Green']]
,因为所有索引都需要匹配
p = ['1', '2', '3', '4']
s = ['Red', 'Red', 'Red', 'Red']
返回将是[]
,因为没有必要的匹配
答案 0 :(得分:1)
首先,根据s
p
中的字符串进行分组
groups = {}
for index, item in zip(p, s):
groups.setdefault(index, []).append(item)
现在,通过将列表转换为集合来检查每个组中是否所有项目都相同(集合将删除重复项目,因此如果长度为1,则所有项目都相同) 。如果不是,请将它们添加到结果中,如此
[items for items in groups.values() if len(set(items)) != 1]
现在,整个程序就像这样
def get_unmatch(p, s):
groups = {}
for index, item in zip(p, s):
groups.setdefault(index, []).append(item)
return [items for items in groups.values() if len(set(items)) != 1]
很少有测试用例,
assert(get_unmatch(['1', '0', '0', '1'], ['Dog', 'Cat', 'Duck', 'Dog']) == [['Cat', 'Duck']])
assert(get_unmatch(['1', '0', '0', '1'], ['Dog', 'Cat', 'Cat', 'Dog']) == [])
assert(get_unmatch(['1', '1', '0', '0', '1'], ['Red', 'Blue', 'Yellow', 'Yellow', 'Blue']) == [['Red', 'Blue', 'Blue']])
assert(get_unmatch(['1', '1', '1', '1'], ['Red', 'Red', 'Red', 'Green']) == [['Red', 'Red', 'Red', 'Green']])
assert(get_unmatch(['1', '2', '3', '4'], ['Red', 'Red', 'Red', 'Red']) == [])
答案 1 :(得分:0)
这是我使用set
s:
def matcher(p, s):
data = {}
for k,v in zip(p,s):
data.setdefault(k, []).append(v)
for k,v in data.items():
if len(set(v)) != 1:
print v
return
函数matcher
首先创建dict
个具有相同索引的值(' 0'或' 1')。此dict
中的示例项目为1 -> ['Dog', 'Dog']
。在列表上调用set
将仅保留1个项目,因为所有列表项都是相同的Dog
。如果它们不相同,len(set(v))
会返回一个包含多个项目的集合,我们会打印此列表。
p = ['1', '0', '0', '1']
s = ['Dog', 'Cat', 'Duck', 'Dog']
print p
print s
matcher(p, s)
p = ['1', '1', '0', '0', '1']
s = ['Red', 'Blue', 'Yellow', 'Yellow', 'Blue']
print p
print s
matcher(p, s)
p = ['1', '1', '1', '1']
s = ['Red', 'Red', 'Red', 'Green']
print p
print s
matcher(p, s)
p = ['1', '2', '3', '4']
s = ['Red', 'Red', 'Red', 'Red']
print p
print s
matcher(p, s)
['1', '0', '0', '1']
['Dog', 'Cat', 'Duck', 'Dog']
['Cat', 'Duck']
['1', '1', '0', '0', '1']
['Red', 'Blue', 'Yellow', 'Yellow', 'Blue']
['Red', 'Blue', 'Blue']
['1', '1', '1', '1']
['Red', 'Red', 'Red', 'Green']
['Red', 'Red', 'Red', 'Green']
['1', '2', '3', '4']
['Red', 'Red', 'Red', 'Red']