3 votes

Compter le nombre de paires dans la liste sans tenir compte de l'ordre

Par exemple, si j'ai le script suivant :

import collections

lst = [['a','b'],['b','a'],['c','d'],['c','d'],['d','c']]

print([(a, b, v) for (a, b),v in collections.Counter(map(tuple,lst)).items()])

J'obtiens le résultat suivant :

[('a', 'b', 1), ('b', 'a', 1), ('c', 'd', 2), ('d', 'c', 1)]

Je peux adapter mon code pour obtenir le résultat suivant :

[('a', 'b', 2), ('c', 'd', 3)]

Une fonction qui ne tient pas compte de l'ordre des paires ?

4voto

Dan Points 18107

Utilisez une structure de données qui ne se préoccupe pas de l'ordre. Dans ce cas, vous aurez besoin de frozenset au lieu d'un set parce que Counter exige qu'il soit hachable. Mais en fait, il s'agit d'une simple substitution de tuple dans votre code original pour frozenset :

print([(a, b, v) for (a, b),v in collections.Counter(map(frozenset,lst)).items()])

Sortie :

[('a', 'b', 2), ('d', 'c', 3)]

2voto

CDJB Points 12533

Vous pourriez simplement trier chaque élément de la liste avant de compter, comme suit :

import collections

lst = [['a','b'],['b','a'],['c','d'],['c','d'],['d','c']]

sorted_lst = [sorted(x) for x in lst]

print([(a, b, v) for (a, b),v in collections.Counter(map(tuple,sorted_lst)).items()])

Sortie :

[('a', 'b', 2), ('c', 'd', 3)]

2voto

Bharath_Raja Points 562

Le fait de trier la liste avant d'en obtenir des collections résout le problème.

import collections

lst = [['a','b'],['b','a'],['c','d'],['c','d'],['d','c']]

sort_list = sorted(x) for x in lst

print([(a, b, v) for (a, b),v in collections.Counter(map(tuple,sort_list)).items()])

1voto

Albin Paul Points 2119

Vous pouvez trier les valeurs de la clé a,b et utiliser groupby en itertools y luego sum tous les éléments du groupe.

import itertools as it
lst = [['a','b'],['b','a'],['c','d'],['c','d'],['d','c']]
output = [(*group,sum(1 for i in elements)) for group,elements in it.groupby(lst,key=lambda x:sorted(x))]
print(output)

SORTIE

[('a', 'b', 2), ('c', 'd', 3)]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X