J'avais deux liste: et je voulais obtenir: p> a et b corrélé l'un à l'autre, Je l'ai essayé avec si elle a échoué p > Comment obtenir c en python? p> p> A [I] code> lié à B [i] code>, lorsque la valeur dans a code> change comme 0 code> à 1 code>, 12 code> dans la première liste interne de C code>. p>
4 Réponses :
Ce code produit c code> de manière suffisante (fourni A code> et b code> sont toujours ajustés de la même manière que dans l'exemple) : a=[0,0,0,1,1,1,1,2,2]
b=[2,5,12,2,3,8,9,4,6]
c = []
i = 0
while i < len(a):
d = a.count(a[i])
c.append([a[i]] + b[i:i + d])
i += d
print(c) # ==> [[0, 2, 5, 12], [1, 2, 3, 8, 9], [2, 4, 6]]
Nous pouvons zip code> les listes, groupe par première valeur à partir de A code> et faire des listes avec la seconde: from itertools import groupby
from operator import itemgetter
a=[0,0,0,1,1,1,1,2,2]
b=[2,5,12,2,3,8,9,4,6]
[list(map(itemgetter(1), group)) for _, group in groupby(zip(a, b), key=itemgetter(0))]
#[[2, 5, 12], [2, 3, 8, 9], [4, 6]]
Semblable à la réponse de @thierry Lathuille, mais répeint actuellement les clés des sous-listes comme demandé par OP:
import itertools as it ib = iter(b) [[k, *(next(ib) for _ in gr)] for k, gr in it.groupby(a)] # [[0, 2, 5, 12], [1, 2, 3, 8, 9], [2, 4, 6]]
Voici ma solution simple. Notez que vous fractionnez la liste par les chefs d'élimination de la liste A. La dentque est utilisée pour les éléments apparaissants dans O (1) heure de la gauche.
import itertools
from collections import Counter, deque
a = [0,0,0,1,1,1,1,2,2]
b = deque([2,5,12,2,3,8,9,4,6])
c = Counter(a)
new_list=[]
for x in c:
new_list.append([x]+[b.popleft() for i in range(a[x])])
Montrez-nous comment vous feriez cela avec la liste Itération.