2009-03-16 27 views
2

in meiner Liste existiert:überprüfen Sie, ob Wert in verschachtelten Listen

animals = [ ['dog', ['bite'] ], 
      ['cat', ['bite', 'scratch'] ], 
      ['bird', ['peck', 'bite'] ], ] 

add('bird', 'peck') 
add('bird', 'screech') 
add('turtle', 'hide') 

Die Add-Funktion sollte prüfen, ob das Tier und Handeln nicht vor dem Hinzufügen von ihnen in die Liste aufgenommen worden. Gibt es eine Möglichkeit, dies zu erreichen, ohne eine Schleife für jeden Schritt in die Liste zu verschachteln?

Antwort

4

Während es möglich ist, eine generische zu konstruieren Funktion, die das Tier in der Liste mit a.index findet oder mit "Hund" in Tieren testet, Sie wollen wirklich ein Wörterbuch hier, sonst wird die Add-Funktion abgrundtief wie mehr skalieren Tiere werden hinzugefügt:

animals = {'dog':set(['bite']), 
      'cat':set(['bite', 'scratch'])} 

Sie können dann "One-Shot" die Funktion add mit setdefault:

animals.setdefault('dog', set()).add('bite') 

Es wird die 'Hund' Schlüssel erstellen, wenn es nicht vorhanden ist, und da setdefault Gibt die Menge zurück, die entweder existiert oder gerade erstellt wurde. Sie können dann die Bissaktion hinzufügen. Sets stellen sicher, dass es keine Dubletten automatisch gibt.

6

Sie verwenden den falschen Datentyp. Verwenden Sie ein dict von set s statt:

def add(key, value, userdict): 
    userdict.setdefault(key, set()) 
    userdict[key].add(value) 

Verbrauch:

animaldict = {} 
add('bird', 'peck', animaldict) 
add('bird', 'screech', animaldict) 
add('turtle', 'hide', animaldict) 
+0

Wenn userdict ein collections.defaultdict (set) ist, dann können Sie den Aufruf von setdefault weglassen - einfacher zu verstehen, IMHO. –

+0

setdefault gibt den vorhandenen oder erstellten Wert zurück. Sie können userdict.setdefault (key, set()). Add (value) verwenden oder zur Lesbarkeit in einer Variablen speichern. –

0
animals_dict = dict(animals) 

def add(key, action): 
    animals_dict.setdefault(key, []) 
    if action not in animals_dict[key]: 
     animals_dict[key].append(action) 

(Aktualisiert verwenden setdefault - nice one @recursive)

0

Sie sollten wirklich ein Wörterbuch für diesen Zweck verwenden. Oder alternativ eine Klasse Animal.

if not any((animal[0] == "bird") for animal in animals): 
    # append "bird" to animals 
4

Basierend auf Lösung der rekursiven, in Python 2.5 oder höher Sie die defaultdict Klasse verwenden können, etwa wie folgt:

Sie könnten Ihren Code wie folgt verbessern

from collections import defaultdict 

a = defaultdict(set) 

def add(animal, behavior): 
    a[animal].add(behavior) 

add('bird', 'peck') 
add('bird', 'screech') 
add('turtle', 'hide') 
0

Während ich zustimme, mit den anderen re. Ihre Wahl der Datenstruktur, hier ist eine Antwort auf Ihre Frage:

def add(name, action): 
    for animal in animals: 
     if animal[0] == name: 
      if action not in animal[1]: 
       animal[1].append(action) 
      return 
    else: 
     animals.append([name, [action]]) 

Die for Schleife eine unvermeidliche Folge Ihrer Datenstruktur ist, weshalb jeder berät Sie Wörterbücher statt zu betrachten.

Verwandte Themen