Ich habe eine Liste von Listen wie unten gezeigt mit dem Namen eines Tieres als Schlüssel und einer ID, Status als Wert. Ein Tier kann mehrere Werte haben und jede ID wird mehrmals mit Bestanden / Nicht Bestanden-Status wiederholt. Für viele Tiere gibt es viele solche Aufzeichnungen. Ich versuche, jede Zeile in Python zu durchlaufen und möchte berechnen - für ein Tier, welche IDs übergeben werden. Ein Ausweis gilt als bestanden für ein Tier, wenn es keinen Status "Fehlgeschlagen" enthält. Logischerweise verstehe ich, dass es zwei for-Schleifen verwenden wird, aber nicht in der Lage ist, dies durch Python-Code zu setzen. Danke für Ihre Hilfe.

[(u'Tiger', (u'PRO-16', u'Passed')),
 (u'Tiger', (u'PRO-16', u'Failed')),
 (u'Tiger', (u'PRO-17', u'Failed')),
 (u'Tiger', (u'PRO-17', u'Passed')),
 (u'Monkey', (u'PRO-18', u'Passed')),
 (u'Monkey', (u'PRO-18', u'Failed'))
 (u'Monkey', (u'PRO-19', u'Passed')),
 (u'Monkey', (u'PRO-20', u'Failed')),
 (u'Elephant', (u'PRO-21', u'No Run')),
 (u'Elephant', (u'GR-01', u'Passed'))].......................
-1
user5253936 22 Aug. 2015 im 03:29

3 Antworten

Beste Antwort

Speichern Sie die Erfolge in einem set und die Fehler in einem anderen set. Gehen Sie die Daten durch und fügen Sie jeden Eintrag in das richtige set ein, je nachdem, ob er einen Fehler enthält. Subtrahieren Sie schließlich die Fehler von den Erfolgen, und Sie haben alle Erfolge, bei denen keine Fehler übereinstimmen (ich habe dieses Ergebnis direkt gedruckt).

data = [(u'Tiger', (u'PRO-16', u'Passed')),
 (u'Tiger', (u'PRO-16', u'Failed')),
 (u'Tiger', (u'PRO-17', u'Failed')),
 (u'Tiger', (u'PRO-17', u'Passed')),
 (u'Monkey', (u'PRO-18', u'Passed')),
 (u'Monkey', (u'PRO-18', u'Failed')),
 (u'Monkey', (u'PRO-19', u'Passed')),
 (u'Monkey', (u'PRO-20', u'Failed')),
 (u'Elephant', (u'PRO-21', u'No Run')),
 (u'Elephant', (u'GR-01', u'Passed'))]

succeeded = set()
failed = set()
for item in data:
    if item[1][1] != 'Failed':
        succeeded.add((item[0], item[1][0]))
    else:
        failed.add((item[0], item[1][0]))

Ergebnis:

>>> print(*(succeeded-failed), sep='\n')
('Elephant', 'GR-01')
('Monkey', 'PRO-19')
('Elephant', 'PRO-21')

Sie können diese auch nach Tieren gruppieren, mit einem defaultdict:

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> for k,v in succeeded-failed:
...     d[k].append(v)
...
>>> for k in d:
...     print(k + ': ' + ', '.join(d[k]))
...
Monkey: PRO-19
Elephant: PRO-21, GR-01
0
TigerhawkT3 22 Aug. 2015 im 02:22

Nun, zuerst, um Ihre Liste zu durchlaufen und alle Elemente als eindeutige Variablennamen in einer schönen for-Schleife zu behalten:

data = *your list above*
for animal, (test_id, status) in data:
    *CODE HERE*

Eine wirklich schnelle und schmutzige Methode, um Ihre spezifische Frage zu lösen und dabei nur native Python-Datenstrukturen zu verwenden

results = {}
bad = {}
for animal, (test_id, status) in data:
    # Add the animal to the dict if it does not exist yet
    if animal not in results:
        results[animal] = []

    # if current test failed
    if (status == 'Failed'):

        # Remove test if we marked it as passed before
        if (test_id in results[animal]):
            results[animal].remove(test_id)

        # Ad the test to the 'bad' list
        if animal not in bad:
            bad[animal] = []
        bad[animal].append(test_id)

    # if the animal is not on the bad list at all add it to the good list
    elif animal not in bad and test_id not in results[animal]:
        results[animal].append(test_id)

    # if the current test is not in the animals bad list, add it to the good list
    elif test_id not in bad[animal] and test_id not in results[animal]:
        results[animal].append(test_id)

print('Tests that passed: {}'.format(results))
print('bad: {}'.format(bad))

Dieser Code mit Ihren Datenausgaben:

Tests that passed: {u'Tiger': [], u'Monkey': [u'PRO-19'], u'Elephant': [u'PRO-21', u'GR-01']}
bad: {u'Tiger': [u'PRO-16', u'PRO-17'], u'Monkey': [u'PRO-18', u'PRO-20']}
0
Alex Shmakov 22 Aug. 2015 im 01:03

Versuchen:

ids = {}
for line in animalinfo:
   if line[1][1]!="Failed":
       if line[0] in ids:
          ids[line[0]].append(line[1][0])
       else:
           ids[line[0]]= [line[1][0]]

Es wird dir geben:

{u'Tiger': [u'PRO-16', u'PRO-17'], u'Monkey': [u'PRO-18', u'PRO-19'], u'Elephant': [u'PRO-21', u'GR-01']}
0
BigOther 22 Aug. 2015 im 00:45