J'ai les listes suivantes:

first=['a','b','c']  
second=['a','a']  
third=['a','b']

Existe-t-il un moyen de comparer le deuxième au premier, donc j'obtiens FAUX et VRAI pour comparer le troisième au premier? J'ai essayé d'utiliser des ensembles mais set(second).issubset(first) renvoie True, ce qui n'est pas ce dont j'ai besoin.

0
West 14 avril 2018 à 11:39

4 réponses

Meilleure réponse
first=['a','b','c']  
second=['a','a']  
third=['a','b']

def sub_set(lst1, lst2):  
    tmp = lst2[:] 
    for i in lst1:
        if i in tmp:
            tmp.remove(i)
        else:
            return False
    return True

print sub_set(second, first)
print sub_set(third, first)

Production

False
True
1
shahaf 14 avril 2018 à 08:50

Si l'ordre n'a pas d'importance, vous pouvez utiliser un dictionnaire de comptage:

diffs = {a : second.count(a) - first.count(a) for a in second}
diffs_list = list(diffs1.values())

is_subset = len(diffs_list) == diffs_list.count(0)

Cela renvoie True pour third et False pour second.

Cela compte simplement l'occurrence de chaque élément du sous-ensemble dans le sur-ensemble, calcule la différence de chaque comptage, puis vérifie que toutes les différences sont 0.

0
ernest_k 14 avril 2018 à 09:10

Vous pouvez faire une comparaison en utilisant le découpage:

>>> first = ['a', 'b', 'c']
>>> second = ['a', 'a']
>>> third = ['a', 'b']
>>> second == first[:len(second)]
False
>>> third == first[:len(third)]
True
0
Srisaila 14 avril 2018 à 08:57

Si l'ordre est important et que les éléments doivent être séquentiels, vous pouvez convertir la liste en chaîne (avec join) et utiliser ceci:

first=['a','b','c']
second=['a','a']
third=['a','b']

def is_sublist(sublist, reflist):
    return ''.join(sublist) in ''.join(reflist)

print(is_sublist(sublist=second, reflist=first))
print(is_sublist(sublist=third, reflist=first))
1
hiro protagonist 14 avril 2018 à 08:54