2017-03-08 1 views
1

Je souhaite lire un nombre spécifique de lignes d'une liste et affecter toutes ces valeurs à une nouvelle liste. Ensuite, je veux lire le prochain groupe de la dernière valeur + 1 ligne d'avant pour exactement le même nombre de lignes et les affecter à une nouvelle liste. Jusqu'à présent, j'ai ceci:comment générer plusieurs listes et leur affecter des valeurs

Disons que u = [1,2,3....,9,10,11,12,13...,19,20] et je veux affecter les 10 premières valeurs de u dans mon nouveau généré list1 = [] => list1 = [1,2,..9,10]

alors je veux les 10 valeurs de u à affecter à list2 si list2 = [11,12,13..,20]. Le code est à ce jour:

nLines = 10 
nrepeats = 2 
j=0 
i=0 

while (j<nrepeats): 
### Generating empty lists ### 
mklist = "list" + str(j) + " = []" 
### do the segmentation ### 
for i, uline in enumerate(u): 
    if i >= i and i < i+nLines: 
     mklist.append(uline) 
j=j+1 

le problème est maintenant que je ne peux pas ajouter à mklist parce qu'il est une chaîne:

AttributeError: 'str' object has no attribute 'append' 

Comment puis-je attribuer ces valeurs dans cette boucle?

+1

-vous Veux-tu vraiment que tout devienne une chaîne? Vous ne voulez pas vous retrouver avec une liste de listes? – Denziloe

+0

'if i> = i et i

+0

@PatrickHaugh Je voulais faire: 'if i> = 0 et i <10' lire ces lignes et les ajouter. Cependant, je n'ai pas encore compris comment la condition se présente dans l'étape suivante de la boucle quand il devrait lire les valeurs 11 à 20. – Shaun

Répondre

1

Vous pouvez utiliser la fonction zip aux éléments du groupe de iterables en groupes de la même taille. Il y a en fait deux manières, qui diffèrent par la façon dont vous façon de traiter les cas où vous ne pouvez pas diviser les données source proprement

u = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21] 

La première est avec zip régulière et élimine le fragment restant

>>>list(zip(*[iter(u)]*10)) 
[(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), (11, 12, 13, 14, 15, 16, 17, 18, 19, 20)] 

la deuxième façon utilise itertools.zip_longest et plaquettes sur le dernier groupe avec quelques fillvalue (par défaut None)

>>>import itertools 
>>>list(itertools.zip_longest(*[iter(u)]*10, fillvalue=None)) 
[(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), (11, 12, 13, 14, 15, 16, 17, 18, 19, 20), (21, None, None, None, None, None, None, None, None, None)] 
+0

génial! comment puis-je accéder par exemple aux dix premières valeurs? disons que j'ai u comme défini ci-dessus et x similaires mais des nombres différents. Maintenant, je veux tracer les 10 premiers nombres de u par rapport aux dix premiers nombres de x – Shaun

+0

Vous y auriez accès comme vous le feriez pour n'importe quelle autre liste. Les 10 premières valeurs seraient à l'index zéro de la liste résultante. –

+0

comment puis-je accéder à la première entrée de la première liste? donc si c'est ((1,2,3), (4,5,6), ....) comment puis-je imprimer 1 de la première liste? – Shaun

2

Vous pouvez utiliser une collection plus appropriée, par exemple, un dictionnaire:

nLines = 10 
nrepeats = 2 
j=0 
i=0 

my_dict = {} 

while (j<nrepeats): 
    ### Generating empty lists ### 
    my_dict[str(j)] = [] 
    ### do the segmentation ### 
    for i, uline in enumerate(u): 
     if i >= i and i < i+nLines: 
      my_dict[str(j)].append(uline) 
j=j+1 
+0

c'est une bonne idée. comment puis-je y accéder? juste my_dict [0] pour les 10 premières valeurs? – Shaun

+0

@Shaun Oui, c'est vrai, mais vous devrez convertir l'accesseur en une chaîne: par ex. my_dict [str (0)] retournera le premier tableau. –

+0

bonne réponse, merci! Votre chemin fonctionne aussi bien que celui de Patrick Haugh :) – Shaun