比较和匹配python列表

时间:2014-11-23 01:28:24

标签: python list

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

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']

返回将是[],因为没有必要的匹配

2 个答案:

答案 0 :(得分:1)

  1. 首先,根据s

    中的索引对p中的字符串进行分组
    groups = {}
    
    for index, item in zip(p, s):
        groups.setdefault(index, []).append(item)
    
  2. 现在,通过将列表转换为集合来检查每个组中是否所有项目都相同(集合将删除重复项目,因此如果长度为1,则所有项目都相同) 。如果不是,请将它们添加到结果中,如此

    [items for items in groups.values() if len(set(items)) != 1]
    
  3. 现在,整个程序就像这样

    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']