比较和匹配python列表

比较和匹配python列表,python,list,Python,List,假设我有一个模式列表和一个字符串列表(长度相等)。通过比较字符串列表中每个字符串的位置与模式列表中的模式,我需要返回一个列表,其中包含所有不匹配的字符串。这里有一个例子 p = ['1', '0', '0', '1'] s = ['Dog', 'Cat', 'Duck', 'Dog'] p是一种模式,该列表说明位置索引0和索引3中的项目应该匹配,位置索引1和索引2中的项目应该匹配。在这里我们可以看到“狗”和“狗”匹配,但“猫”和“鸭”不匹配。因此,回报将是 [['Cat', 'Duck']]

假设我有一个模式列表和一个字符串列表(长度相等)。通过比较字符串列表中每个字符串的位置与模式列表中的模式,我需要返回一个列表,其中包含所有不匹配的字符串。这里有一个例子

p = ['1', '0', '0', '1']
s = ['Dog', 'Cat', 'Duck', 'Dog']
p是一种模式,该列表说明位置索引0和索引3中的项目应该匹配,位置索引1和索引2中的项目应该匹配。在这里我们可以看到“狗”和“狗”匹配,但“猫”和“鸭”不匹配。因此,回报将是

[['Cat', 'Duck']]
[]
例如,如果字符串为
s=['Dog'、'Cat'、'Cat'、'Dog']
则返回值为

[['Cat', 'Duck']]
[]
还有一些例子:

p = ['1', '1', '0', '0', '1']
s = ['Red', 'Blue', 'Yellow', 'Yellow', 'Blue']
因为索引0、1和4不匹配,所以返回的值将是
[['Red','Blue','Blue']]

p = ['1', '1', '1', '1']
s = ['Red', 'Red', 'Red', 'Green']
返回值应该是
[[['Red','Red','Red','Green']]
,因为所有索引都需要匹配

p = ['1', '2', '3', '4']
s = ['Red', 'Red', 'Red', 'Red']
由于不需要匹配,因此返回值将为
[]

  • 首先,根据
    p
    中的索引将
    s
    中的字符串分组

    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]
    
  • 现在,整个程序变成这样

    [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']) == [])
    

    下面是我使用
    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
    首先创建具有相同索引(“0”或“1”)的值的
    dict
    。此
    dict
    中的示例项将是
    1->['Dog','Dog']
    。在列表上调用
    set
    将只保留1个项目,因为所有列表项目都是相同的
    Dog
    。如果它们不相同,
    len(set(v))
    将返回一个包含多个项目的集合,我们将打印此列表

    样本输入: 样本输出: