2016-04-03 6 views
0

Ich habe eine Liste Verständnis mir folgendes zu bieten:Anfügen einzelnen Listen aus einer Liste Verständnis erstellt Werte von Eingang()

listoflists = [[] für i in range (252 * 5)]

Ich habe dann die Liste in variablen neuen Listen so vereinfacht, dass sie nur die Anzahl der Listen im Bereich (Wochen) enthält, die eine dynamische Variable ist.

Ich möchte jede einzelne Liste in der folgenden Schleife für einen angegebenen Bereich anfügen, wobei der Append-Prozess sich durch jede Liste bewegt, nachdem sie eine bestimmte Länge erreicht hat. Die Werte werden von einer Eingabefunktion generiert. Zum Beispiel, wenn die erste Liste in neuen Listen eine Länge von 5 überschreitet, möchte ich, dass die Werte nach der 5. Schleife dann an die nächste Liste angehängt werden und so weiter. Der Code, den ich zur Zeit habe, ist:

p = 0 
    singlist = [] 
    listoflists = [[] for i in range(252*5)] 
    newlists= [listoflists[i] for i in range(weeks)] 
    while p<(int(people)*weeks): #fix appending process 
     for i in range(int(people)*weeks): 
     weekly =input("Put your hours: ") 
     singlist.append(int(weekly)) 
     p += 1 
     if weekly.isalpha() == True: 
     print("Not a valid amount of time") 

for i in range(0,weeks): 
    while len(newlists[i])<int(people): 
    newlists[i].append(singlist[i])  

Dieser Code jedoch hängt die gleichen Werte für alle Listen in Reichweite Wochen. Was ist der effizienteste Weg, um das zu beheben? Vielen Dank!

wenn singlist = [10,15,20,25] Wunsch Ausgang für newlists ist: [[10,15], [20,25]]

Wie ich das Programm strukturiert haben:

import sys 
import numpy as np 
import pandas as pd 
from datetime import tzinfo,timedelta,datetime 
import matplotlib.pyplot as plt 
import itertools as it 
from itertools import count,islice 

team = [] 
y = 0 
while y == 0: 
    try: 
     people = input("How many people are on your engagement? ") 
     if people.isdigit() == True: 
      y += 1 
    except: 
     print("Not a number try again") 

z= 0 
while z<int(people): 
     for i in range(int(people)): 
       names = input("Name: ") 
       if names.isalpha() == False: 
        team.append(names) 
        z+=1 
       elif names.isdigit() == True: 
        print("Not a name try again") 



ties = [] # fix looping for more than one person 
e = 0 
while e<int(people): 
    for i in range(int(people)): 
     title = input("What is their title: ") 
     if title.isdigit() == True: 
      print("Not a title try again") 
     else: 
      ties.append(title) 
      e+=1 


values = [] #fix looping for more than one person 
t= 0 
while t <int(people): 
    for i in range(int(people)): 
     charge = input("How much are you charging for them: ") 
     if charge.isalpha() == True: 
      print("Not a valid rate") 
     else: 
      values.append(int(charge)) 
      t +=1 


weeks = int(input("How many weeks are you including: ")) 
days = [] 
x = 0 
while x<weeks: #include a parameter for dates of a 7 day difference to only be permitted 
    try: 
     for i in range(int(weeks)): 
      dates = input("Input the dates (mm/dd/yy): ") 
      dt_start = datetime.strptime(dates,'%m/%d/%y') 
      days.append(dates) 
      x+=1 
    except: 
     print("Incorrect format")    


p = 0 
singlist = [] 
listoflists = [[] for i in range(252*5)] 
newlists= [listoflists[i] for i in range(weeks)] 
while p<(int(people)*weeks): #fix appending process 
    for i in range(int(people)*weeks): 
     weekly =input("Put your hours: ") 
     singlist.append(int(weekly)) 
     p += 1 
     if weekly.isalpha() == True: 
      print("Not a valid amount of time") 


def func(items,n): 
    items = iter(items) 
    for i in it.count(): 
     out = it.islice(items,weeks*i,weeks*i+n) 
     if not out: 
      break 
output = list(func(singlist,weeks)) 
+0

Die Anzahl der 'len()' Funktionen könnte anzeigen, dass es einen besseren Weg gibt, es zu tun. Können Sie das ursprüngliche Problem feststellen, für das Sie diesen Code geschrieben haben? –

+0

Ich habe den obigen Code mit dem neuen Code, den ich geschrieben habe, bearbeitet und hoffentlich den gewünschten Output hinzugefügt, der mir helfen wird zu verstehen; Das Problem, das ich löse, besteht darin, ein dynamisches Budgetierungstool zu erstellen, bei dem es mehrere Eingabeschleifen gibt, deren Werte zu einem Datenrahmen aggregieren. Die gewünschte Ausgabe, die ich will, ist in den obigen Bearbeitungen –

Antwort

0
# items = [1,2,3,...n] 
# output = [[1,2],[3,4],..], n = 2 elements each 
items_ = iter(items) 
outiter = iter(lambda: [next(items_) for i in range(n)],[]) 
outlist = list(outiter) 

Sie können das gleiche tun mit while Schleife anstelle von count() und [a:b] Scheibe Betrieb auf Liste statt islice(). Die Verwendung von Iteratoren ist jedoch sehr effizient.

+0

danke! Welche Funktion hat die Funktion iter (items)? Ich habe gerade den Code ausgeführt und ich erhalte 'Modul' Objekt ist nicht aufrufbar –

+0

'iter()' ist eine eingebaute Funktion. Erhalten Sie den Fehler in dieser Zeile? Gib 'iter' beim Dolmetscher ein, sag mir, was es sagt. –

+0

Ich reparierte dieses Problem musste nun meinen Kernel neu starten, aber ich habe den Code in der neugestarteten Umgebung ausgeführt und es ist jetzt in dieser Codezeile eingefroren. Kann die Menge an Speicher sein, die ich auf meinem comp habe –