Jestem Newbie w Pythonie.

Słownik ma wiele wartości.

dc = {1:['2', '3'], 2:['3'], 3:['3', '4']}

Jeśli chcesz, znajdziesz "DC", istnieją trzy wystąpienia "3". Pierwsze wystąpienie jest w 1: ['2', "3"]. Chciałbym iterować nad dyktatem

if first occurrence of '3' occurs:
  dosomething()

else occurrence of '3' afterwards:#i.e. 2nd time, 3rd time....
  dosomethingelse()

Jak mogę to zrobić w Pythonie

Dziękuję Ci.

3
Pujan Srivastava 28 wrzesień 2011, 06:37

7 odpowiedzi

Najlepsza odpowiedź

Możesz także zachować liczbę razy, jaki element był widoczny. Użyj dyktatu dla tego i przyrost przy każdym obserwacji:

#!/usr/bin/python

dc = {3:['3', '4'], 1:['2', '3'], 2:['3']}
de={}

def do_something(i,k):
    print "first time for '%s' with key '%s'" % (i,k)

def do_somethingelse(i,j,k):
    print "element '%s' seen %i times. Now with key '%s'" % (i,j,k) 

for k in sorted(dc):
    for i in dc[k]:
        if i not in de:
            de[i]=1
            do_something(i,k)
        else:
            de[i]+=1
            do_somethingelse(i,de[i],k)

Jak powiedzieli, że inni słowniki nie mają tego samego zamówienia, jako wystawianie lub listę kodu. Możesz po prostu posortować klucze (z {X0}}), aby odróżnić "pierwsze" vs później, jeśli jest to takie samo jak kolejność sortowania. Ta metoda jest łatwo rozszerzona na "do_soming" na podstawie sposobu, w jaki wielu> razy, jaki przedmiot został zobaczyć.

Wynik:

first time for '2' with key '1'
first time for '3' with key '1'
element '3' seen 2 times. Now with key '2'
element '3' seen 3 times. Now with key '3'
first time for '4' with key '3'

Alternatywnie:

r=[]
for k in sorted(dc):
    print dc[k]
    if '3' in dc[k]:
        r.append("'3' number {} with key: {}".format(len(r)+1,k))

Produkuje:

["'3' number 1 with key: 1", "'3' number 2 with key: 2", "'3' number 3 with key: 3"]

Lista r będzie miała 3 ciągi w kolejności, w jakiej w porządku, które są posortowane, a następnie po prostu iteruj przez sekwencję r.

A jeśli szukasz "pierwszego" 3, a następnie reszta, możesz użyć rozumienia listy:

>>> l=[i for sub in [dc[k] for k in sorted(dc)] for i in sub if i == '3']
>>> l
['3', '3', '3']
>>> l[0]
'3'
>>> l[1:] #all the rest...
1
the wolf 28 wrzesień 2011, 20:55

Zakładając, że wartości w DICT są listami:

foundThree = False
for key, val in dc.items():
    if '3' in val and not foundThree:
        foundThree = True
        # doSomething()
    elif '3' in val:
        # doSomethingElse()
    else:
        # doAnotherThing()

Edytuj (aktualizacja komentarzy na temat znalezienia pierwszej "3" na liście, która jest wartością dict elementu) - powinna to działać:

for key, val in dc.items():
    foundThree = False
    for n in val:
        if n == '3' and not foundThree:
            foundThree = True
            # doSomething()
        elif n == '3': 
            # doSomethingElse()
        else:
            # doAnotherThing()
4
chown 28 wrzesień 2011, 03:01

Większość tego, o co pytasz, jest dość prosta, jedyna część widzę, że masz problemy z określeniem, jeśli numer 3 występuje po pierwszym elemencie.

Możesz to zrobić za pomocą:

list[1:]

Na przykład:

>>> 3 in [1,2,4,5][1:]
False
>>> 3 in [3,1,2,4][1:]
False
>>> 3 in [1,2,3,4][1:]
True

Oto coś, co powinno pracować:

dc = {1:['2', '3'], 2:['3'], 3:['3', '4']}

def dosomething(): print 'something'

def dosomethingelse(): print 'something else'

for key,value in dc.items():
  if value[0] == '3':
    dosomething()
  elif '3' in value[1:]:
    dosomethingelse()
3
Jack Leow 28 wrzesień 2011, 02:58
dict_ = {1:['2', '3'], 2:['3'], 3:['3', '4']}

def dosomething():
  print 'doing something'

def dosomethingelse():
  print 'doing something else'

three_handler = dosomething
for v in dict_.values():
  for three in [x for x in v if x == '3']:
    three_handler()
    three_handler = dosomethingelse

Wynik:

doing something
doing something else
doing something else
3
wim 28 wrzesień 2011, 04:07

Oto alternatywa, która nie używa oświadczenia, aby sprawdzić, czy 3 jest pierwszym wystąpieniem.

d = {1:['2', '3'], 2:['3'], 3:['3', '4']}

def doSomething():
   print('ds')

def doSomethingElse():
   print('dse')

for key,value in d.iteritems():
   do = doSomething
   for item in value:
      if item == '3':
         do()
         do = doSomethingElse
2
joshayers 28 wrzesień 2011, 02:50

Zakładając, że "pierwszy" jest tak samo posortowany przez klucze słownika, to działa:

>>> dc = {1:['2', '3'], 2:['3'], 3:['3', '4']}
>>> [dc[k] for k in sorted(dc) if '3' in dc[k]][0]
['2', '3']
>>> [dc[k] for k in sorted(dc) if '3' in dc[k]][1:]
[['3'], ['3', '4']]
0
user648852user648852 28 wrzesień 2011, 22:43

Poniższy fragment kodu da ci pomysł na to, jak to zrobić. Będzie to działać w środowisku wykonania pojedynczego wątku.

Aby uzyskać więcej informacji, rozpocząć w Python Docs i nurkuj do Pythona

firstInstance = False
for k in mydict.keys():
  obj = mydict.get(k)
  for i in range(len(obj)):
    value = obj[i]
    if value == 3 and firstInstance:
       doSomething()
       firstInstance = True
    else:
       doSomethingElse()
0
Shadow Wizard is Vaccinating 24 listopad 2011, 11:54