Domanda

Ho una serie di Python tuple che rappresenta le coordinate:

tuples = [(1,1), (0,1), (1,0), (0,0), (2,1)]

Voglio creare il seguente elenco:

l = []
for t in tuples:
  l[ t[0] ][ t[1] ] = something

Ho un IndexError:list index out of range.

Il mio background è in PHP e mi aspettavo che in Python è possibile creare elenchi che iniziano con indice > 0, cioèfare lacune e poi riempirle, ma sembra che non è possibile.

L'idea è di avere le liste ordinate in seguito.So che posso fare questo con un dizionario, ma per quanto ne so i dizionari non possono essere ordinati per chiavi.Aggiornamento:Ora so che si può - vedere la soluzione accettata.

Edit:Quello che voglio fare è creare una matrice 2D che rappresenta la matrice descritto con la tupla coordinate, e poi iterare in ordine.Se io uso un dizionario, non ho nessuna garanzia che scorrendo le chiavi saranno in ordine -> (0,0) (0,1) (0,2) (1,0) (1,1) (1,2) (2,0) (2,1) (2,2)

Qualcuno può aiutarmi?

È stato utile?

Soluzione

Cosa intendi esattamente con "ma per quanto ne so i dizionari non possono essere ordinati con i tasti"?

Mentre questo non è rigorosamente il stesso come un "ordinato dizionario", si può facilmente trasformare un dizionario in un elenco, in ordine di chiave, che sembra essere quello che stai dopo:

>>> tuples = [(1,1), (0,1), (1,0), (0,0), (2,1)]
>>> l = {}
>>> for t in tuples:
...    l[t] = "something"
>>> sorted(l) # equivalent to sorted(l.keys())
[(0, 0), (0, 1), (1, 0), (1, 1), (2, 1)]
>>> sorted(l.items()) # make a list of (key, value) tuples, and sort by key
[((0, 0), 'something'), ((0, 1), 'something'), ((1, 0), 'something'), ((1, 1), 'something'), ((2, 1), 'something')]    

(Ho girato something nella stringa "qualcosa" proprio per rendere il codice)

Per fare uso di questa per il tuo caso (se ho capito bene, che è), si sarebbe ancora bisogno di riempire il dizionario con Nessuno dei valori o qualcosa per ogni "vuoto" coordinare tupla)

Altri suggerimenti

No, non è possibile creare un elenco con le lacune.Ma è possibile creare un dizionario con tupla di tasti:

tuples = [(1,1), (0,1), (1,0), (0,0), (2,1)]
l = {}
for t in tuples:
    l[t] = something

Aggiornamento: Provare a utilizzare NumPy, esso fornisce una vasta gamma di operazioni su matrici e array.Citare gratuito pfd su NumPy disponibile sul sito (3.4.3 Piatto Iteratore di indicizzazione): "Come accennato in precedenza, X. piatto restituisce un iteratore che scorrere tutto l'array (in C contigue, in stile con l'ultimo indice di variare il più veloce".Sembra che ciò che è necessario.

Si dovrebbe guardare dicts per qualcosa di simile.

for t in tuples:
  if not l.has_key(t[0]):
    l[t[0]] = {}
  l[t[0]][t[1]] = something

Scorrere il dict è un po ' diverso scorrere una lista, anche se.Avrete le chiavi(), valori() e gli articoli() funzioni per aiutarvi con questo.

EDIT:provare qualcosa di simile per l'ordinazione:

for x in sorted(l.keys()):
   for y in sorted(l[x].keys()):
       print l[x][y]

Si crea un elenco unidimensionale l e si desidera utilizzarlo come un elenco bidimensionale.Ecco perché si ottiene un indice di errore.

Sono disponibili le seguenti opzioni:creare una mappa e utilizzare la tupla t indice:

l = {}
l[t] = something

e vi saranno mostrati voci l, come:

{(1, 1): something}

se si desidera una tradizionale struttura dell'array ti consigliamo di guardare numpy.Con numpy si ottiene n-dimensionale matrici con "tradizionali" di indicizzazione.

Come ho già detto uso numpy,

con numpy è possibile creare un 2-matrice bidimensionale, riempiti con zeri o quelli o ...Tha è possibile riempire qualsiasi valore desiderato con indicizzazione [x,y] come volete.Naturalmente, è possibile scorrere le righe e le colonne o l'intero array come un elenco.

Se si conosce la dimensione di prima mano,si può fare una lista di liste come questa

>>> x = 3
>>> y = 3
>>> l = [[None] * x for i in range(y)]
>>> l
[[None, None, None], [None, None, None], [None, None, None]]

Che è quindi possibile scorrere come è stato originariamente consigliato.

Estendere il Nathan's risposta,

tuples = [(1,1), (0,1), (1,0), (0,0), (2,1)]
x = max(tuples, key = lambda z : z[0])[0] + 1
y = max(tuples, key = lambda z : z[1])[1] + 1
l = [[None] * y for i in range(x)]

E poi si può fare quello che si vuole

Come accennato in precedenza, non è possibile fare le liste con lacune e dizionari potrebbe essere la scelta migliore qui.Il trucco è quello di assicurarsi che l[t[0]] esiste quando si mette qualcosa in posizione t[1].Per questo, mi piacerebbe utilizzare un defaultdict.

import collections
tuples = [(1,1), (0,1), (1,0), (0,0), (2,1)]
l = collections.defaultdict(dict)
for t in tuples:
    l[t[0]][t[1]] = something

Dal l è un defaultdict, se l[t[0]] non esiste, verrà creato un vuoto dict per mettere il vostro something in posizione t[1].

Nota:questo finisce per essere lo stesso come @unwesen risposta, senza la minor tedio di mano il controllo per l'esistenza dell'interno dict.Gesso fino alla concomitanza di rispondere.

Il dict soluzioni sono probabilmente i migliori per la maggior parte degli scopi.Per il tuo problema di iterare su le chiavi in ordine, in generale, invece scorrere la spazio di coordinate, non dict tasti, esattamente allo stesso modo si potrebbe avere per la vostra lista di liste.Utilizzare .ottenere e si può specificare il valore di default da utilizzare per le celle vuote, o, in alternativa, utilizzare "collections.defaultdict"per definire un default a dict momento della creazione.es.

for y in range(10):
    for x in range(10):
        value = mydict.get((x,y), some_default_value)
        # or just "value = mydict[x,y]" if used defaultdict

Se hai bisogno di una lista di liste, è possibile costruire direttamente, come di seguito:

max_x, max_y = map(max, zip(*tuples))
l=[[something if (x,y) in tuples else 0 for y in range(max_y+1)] 
     for x in xrange(max_x+1)]

Se la lista di tuple è probabile che sia lungo, per motivi di prestazioni, si consiglia l'utilizzo di un set per la ricerca,come "(x,y) in tuples"esegue una scansione della lista, piuttosto che una rapida ricerca tramite l'hash.cioè, modificare la seconda riga:

tuple_set = set(tuples)
l=[[something if (x,y) in tuple_set else 0 for y in range(max_y+1)] 
     for x in xrange(max_x+1)]

Penso che tu abbia solo dichiarato one dimensional elenco.

Penso che si dichiara come

l = [][]

Modifica:Che è un errore di sintassi

>>> l = [][]
  File "<stdin>", line 1
    l = [][]
           ^
SyntaxError: invalid syntax
>>> 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top