Domanda

Immagina di avere un'entità nell'archivio dati di Google App Engine, che memorizza collegamenti per utenti anonimi. Desideri eseguire la seguente query SQL, che non è supportata:

SELECT DISTINCT user_hash FROM links

Invece potresti usare:

user = db.GqlQuery("SELECT user_hash FROM links")

Come utilizzare Python nel modo più efficiente per filtrare il risultato, in modo che restituisca un set di risultati DISTINCT? Come contare il set di risultati DISTINCT?

È stato utile?

Soluzione

Un set è un buon modo per affrontarlo:

>>> a = ['google.com', 'livejournal.com', 'livejournal.com', 'google.com', 'stackoverflow.com']
>>> b = set(a)
>>> b
set(['livejournal.com', 'google.com', 'stackoverflow.com'])
>>> 

Un suggerimento con la prima risposta è che insiemi e dicts sono migliori nel recuperare rapidamente risultati unici, l'appartenenza agli elenchi è O (n) contro O (1) per gli altri tipi, quindi se si desidera memorizzare ulteriori dati o fare qualcosa come creare la menzionata lista unique_results , potrebbe essere meglio fare qualcosa del tipo:

unique_results = {}
>>> for item in a:
    unique_results[item] = ''


>>> unique_results
{'livejournal.com': '', 'google.com': '', 'stackoverflow.com': ''}

Altri suggerimenti

Rianimando questa domanda per il completamento:

La parola chiave DISTINCT è stata introdotta in versione 1.7.4 .

Puoi trovare il riferimento GQL aggiornato (ad esempio per Python) qui .

Un'opzione sarebbe quella di mettere i risultati in un oggetto set:

http://www.python.org/doc /2.6/library/sets.html#sets.Set

Il set risultante consisterà solo dei valori distinti passati in esso.

In caso contrario, la creazione di un nuovo elenco contenente solo gli oggetti univoci funzionerebbe. Qualcosa del tipo:

unique_results = []
for obj in user:
    if obj not in unique_results:
        unique_results.append(obj)

Anche quel per può essere condensato in una comprensione di lista.

Mi dispiace scavare questa domanda ma in GAE non posso confrontare oggetti del genere, devo usare .key () per un confronto del genere:

Attenzione, questo è molto inefficiente:

def unique_result(array):
    urk={} #unique results with key
    for c in array:
        if c.key() not in urwk:
            urk[str(c.key())]=c
    return urk.values()

Se qualcuno ha una soluzione migliore, per favore condividi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top