Donc, j'ai un dictionnaire comme celui-ci:
for length, dics in itertools.groupby(dic_parsed_sentences, len):
for index_file in dics:
temp_sentence = dics[index_file]
keys_words = list(temp_sentence.keys())
for index_word in range(len(keys_words)):
test_sent_wids[index_sentence, index_word] = lookup_word2id(keys_words[index_word])
index = index + 1
index_sentence = index_sentence + 1
Je veux le parcourir en boucle en fonction de la longueur des dictionnaires dans ce dictionnaire.
Par exemple,
il contient deux éléments de longueur 5, un élément de longueur 4 et deux éléments de longueur 2. Je veux traiter les éléments de même longueur ensemble (quelque chose comme un groupe par dans les pandas).
Ainsi, la sortie de la première itération ressemblera à ceci (comme vous voyez que seuls les éléments de longueur 5 sont disponibles ici):
for i in dic_parsed_sentences.groupby(dic_parsed_sentences.same_length_items): # this line is sodoku line I dont know how to code it(I mean iterate through same length items in the dicts)
for index_file in dic_parsed_sentences:
temp_sentence = dic_parsed_sentences[index_file]
keys_words = list(temp_sentence.keys())
for index_word in range(len(keys_words)):
arr_sent_wids[index_sentence, index_word] =
keys_words[index_word]
index = index + 1
index_sentence = index_sentence + 1
3 Réponses :
Vous pouvez utiliser itertools.groupby après avoir trié les éléments du dictionnaire par longueur.
import itertools
items = sorted(dic_parsed_sentences.values(), key = len, reverse = True)
for length, dics in itertools.groupby(items, len):
# dics is all the nested dictionaries with this length
for temp_sentence in dics:
keys_words = list(temp_sentence.keys())
for index_word in range(len(keys_words)):
test_sent_wids[index_sentence, index_word] = lookup_word2id(keys_words[index_word])
index = index + 1
index_sentence = index_sentence + 1
Je vous remercie beaucoup pour votre aide. J'ai peu de problème à le faire fonctionner. il dit TypeError: l'objet 'itertools._grouper' n'est pas en indice
dics n'est pas un dictionnaire. Utilisez simplement pour temp_sentence dans les dics:
En fait, j'exécute le même script que vous, et j'ai cet objet 'str' n'a pas d'attribut 'keys' Je pense qu'il n'y a pas de clés dans la temp_sentence code>
Nécessaire d'utiliser dic_parsed_sentences.values () pour obtenir les valeurs plutôt que les clés.
@Barmer Merci beaucoup
une dernière question, est-ce que je peux obtenir le nombre d'éléments à l'intérieur des dics ?
Je ne pense pas. C'est un itérateur, vous ne pouvez donc pas appeler len (dics) .
pas un bon moyen mais au moins donner le nombre: pour x en dés: an.appendix) a = np.array (a) print (a.shape [0])
@sariii Mais cela utilisera l'itérateur dics donc pour temp_sentence dans les dics: ne fonctionnera pas.
ne pouvez-vous pas simplement incrémenter un compteur dans la boucle for ?
Oui :)) Je pense que cela fonctionne aussi. penser compliqué
c'est l'une des choses les plus étranges que j'ai vues! Après avoir ajouté une boucle for pour garder le décompte, il n'atteint jamais les mots-clés dans la dernière boucle. On dirait qu'il atteint la fin du dic pas comme si c'était une variable !!!
@sariii Vous ne devez pas ajouter une nouvelle boucle for , vous devez incrémenter le nombre dans la même boucle. Vous ne pouvez pas utiliser deux fois un itérateur.
Voir stackoverflow.com/questions/10866134/…
bylen = {}
for v in dic_parsed_sentences.values():
l = len(v)
if not l in bylen:
bylen[l] = []
bylen[l].append(list(v.keys()))
for k in reversed(sorted(bylen.keys())):
# use bylen[k]
Vous pouvez le faire en utilisant la méthode suivante:
finds = [[key, len(dic_parsed_sentences[key])] for key in dic_parsed_sentences]
finds.sort(reverse=True, key=lambda x: x[1])
previous = finds[0][1]
res = []
for elem in finds:
current = elem[1]
if current != previous:
previous = current
print(res)
res = []
res.append(list(dic_parsed_sentences[elem[0]]))
print(res)
Qu'entendez-vous par «longueur d'un article»?
Je veux dire la longueur des éléments dans le deuxième dictionnaire. il y a donc deux dic dans le dic extérieur qui a une longueur de 5
@sobek j'ai également inclus et exemple, s'il vous plaît voir ma mise à jour
Veuillez créer un exemple reproductible minimal comprenant le résultat attendu et un code valide. (
for inn'est pas valide, par exemple)@wjandrea est sûr que je fais un exemple minimal reproductible. En fait, je sais que c'est incorrect, cette partie est la partie que je ne sais pas programmer, c'est pourquoi je mets simplement en sudoku ce que je veux dire. bien sûr que je mettrai à jour