Construirea unei liste în interiorul unei liste în python (Programare, Python, Lista)

Pensu a intrebat.

Am încercat să adaug niște date într-o listă în python. De fapt, am de gând să stochez datele ca o listă în interiorul unei liste. Acum, datele nu vin în funcție de index.

Pentru a explica acest lucru, să spunem că am o listă de liste „a”. Acum am date pentru a[2] înainte de a[1]. Și ambele a[1] și a[2] sunt ele însele liste. Acum, evident că nu pot atribui nimic la a[2] înainte de a atribui a[1]. Și nu știu cât de multe liste ar fi acolo. Adică, ar trebui să fie ceva dinamic.

Vreo soluție în acest sens, astfel încât să pot construi cu succes lista?

Comentarii

  • utilizați dicționarul . se potrivește bine pentru cerința dvs.  > Por Marea Neagră.
  • Exemplul tău nu este foarte clar pentru mine. Poți să detaliezi mai mult exemplul tău? –  > Por Pankaj Parashar.
  • Bine, ideea este că am o listă goală, pe care o voi completa. Și, așa cum am spus în exemplu, am date pentru a[1] înainte de a[0]. Acum, nu pot să atribui a[1] înainte de a[0]. Citind răspunsurile, cred că voi alege dicționarele! –  > Por Pensu.
6 răspunsuri
Martijn Pieters

Ai putea adăuga liste goale până când ai suficiente pentru a accesa indexul pentru care ai date:

while len(outerlist) <= idx:
    outerlist.append([])

Cu toate acestea, este posibil să doriți să utilizați un dicționar în schimb, permițându-vă să implementați un sparse în schimb. A collections.defaultdict() obiect este deosebit de util în acest caz:

from collections import defaultdict

data = defaultdict(list)

data[2].append(3)
data[5].append(42)

data are acum chei 2 și 5, fiecare fiind o listă cu câte un element. Nu există intrări pentru 0, 1, 3, sau 4 nu există încă.

Comentarii

  • @DSM: ick, circuitele mele logice inversate au rămas fără cofeină. –  > Por Martijn Pieters.
Hellseher

Am avut aceeași problemă, să umplu lista goală cu o cantitate definită de liste. iată soluția mea Am făcut o „tablă” 6×6 umplută cu O, doar pentru moment:

board = []    
for i in range(6): # create a list with nested lists
    board.append([])
    for n in range(6):
        board[i].append("O") # fills nested lists with data

Rezultat:

[['O', 'O', 'O', 'O', 'O', 'O'],
 ['O', 'O', 'O', 'O', 'O', 'O'],
 ['O', 'O', 'O', 'O', 'O', 'O'], 
 ['O', 'O', 'O', 'O', 'O', 'O'],
 ['O', 'O', 'O', 'O', 'O', 'O'],
 ['O', 'O', 'O', 'O', 'O', 'O']]

Chandan Venkatesh

Cred că această soluție îți rezolvă problema.

Creați lista secundară (inside_list) locală la bucla for.

    outside_list=[]
    for i in range(0,5):
        inside_list=[]
        inside_list.append(i)
        inside_list.append(i+1)
        outside_list.append(inside_list)

       #you can access any inside_list from the outside_list and append     
        outside_list[1].append(100)
        print(outside_list)

Rezultatul:

[[0, 1], [1, 2, 100], [2, 3], [3, 4], [4, 5]]

jabaldonedo

Puteți să o faceți, nu există nicio problemă în a adăuga un element.

>>> a = [[1,2,3], [10,20,30], [100,200,300]]
>>> a[2].append(400)
 [[1, 2, 3], [10, 20, 30], [100, 200, 300, 400]]
>>> a[1].append(40)
 [[1, 2, 3], [10, 20, 30, 40], [100, 200, 300, 400]]

Comentarii

  • Mulțumesc, dar cred că funcționează numai pentru listele care au deja elemente. Vreau să încep de la o listă goală. Nu cred că este posibil să faceți acest lucru într-o listă goală. –  > Por Pensu.
  • Da, exact, în acest caz ați putea adăuga liste goale sau să utilizați un dicționar în schimb, așa cum sugerează alte răspunsuri –  > Por jabaldonedo.
  • Da, cred că dicționarul ar fi o opțiune mai bună de folosit. Mulțumesc! –  > Por Pensu.
Viswesn

Putem folosi primul element din listă ca index și apoi să îl folosim pentru a adăuga valoarea corectă la momentul execuției folosind lista.

def unclean_(index, val, unclean=None):
   is_added = False
   if unclean is None:
       unclean = []
   length = len(unclean)
   if length == 0:
       unclean.append([index, val])
   else:
       for x in range(length):
            if unclean[x][0] == index:
                unclean[x].append(val)
                is_added = True
       if not is_added:
            unclean.append([index, val])

def terminate_even(x):
    if x % 2 == 0:
        raise Exception("Its even number")

def terminate_odd(x):
    if x % 2 != 0:
        raise Exception("Its odd number")

def fun():
    unclean = []
    for x in range(10):
       try:
            terminate_even(x)
       except:
            unclean_("terminate_even", x, unclean)

    for x in range(10):
       try:
            terminate_odd(x)
       except:
            unclean_("terminate_odd", x, unclean)

    for y in unclean:
        print y

 def main():
    fun()

 if __name__ == "__main__":
    main()

 Output:
 -------
     ['terminate_even', 0, 2, 4, 6, 8]
     ['terminate_odd', 1, 3, 5, 7, 9]

Muneeb Ahmad Khurram

Pur și simplu

Voi face cât se poate de simplu, nu este nevoie de module sofisticate,

Doar faceți o listă goală la începutul fișierului și apoi adăugați această listă goală ori de câte ori aveți nevoie,

Exemplu:

Până când funcția get_data dă un anumit rezultat, adăugați liste goale în cadrul unei liste.

#/usr/bin/python3
#coding:utf-8
empty_list = []
r = ''
def get_data():
    # does something here and gives the output
    return output
imp_list = []
while r == %something%:
    r = get_data()
    imp_list.append(empty_list)