2016-06-03 13 views
0

Gegeben aList als:Subset Summe für eine Liste mit dict

[ 
    {'name': 'Hailey', 'age': 20, 'id': 48479}, 
    {'name': 'John', 'age': 40, 'id': 18021}, 
    {'name': 'Asger', 'age': 18, 'id': 22281}, 
] 

und einer gegebenen Zielsumme als targetSum = 50.

Das Problem ist durch aList mit dem Schlüssel age zu suchen, dann Elemente aus aList entfernen, die für age Wert ist nicht gleich (ungefähr) targetSum kombiniert werden. Die Elemente, die zu (ungefähr) targetSum kombiniert werden können, sollten durch ihre id in einer Liste abrufbar sein.

Alternativ zur Vermeidung der Entfernung der Elemente besteht das Problem einfach darin, alle möglichen Kombinationen der gegebenen Elemente zu finden, die ein age Attribut haben, das (ungefähr) zu targetSum aufsummiert.

Ich habe die Funktion zum Finden einer Teilmenge in einer Liste, um Summe zu geben. Allerdings ist die Beschränkung, dass es nur eine Liste von Zahlen so [1, 2, 3, 4, ...] anstelle von Wörterbüchern dauert.

def subsetInListForSum(numbers, target): 
    results = [] 
    for x in range(len(numbers)): 
     results.extend(
      [ 
       combo for combo in combinations(numbers ,x) 
        if sum(combo) == target 
      ] 
     ) 

    print(results) 

Jede Hilfe sehr würde sehr geschätzt :)

+0

'len (Zahlen)' sollte 'len (1, Zahlen + 1)' sein. Ansonsten ist 'combinations (numbers, x)' nichts. – SparkAndShine

Antwort

2

Ihr Code wird wie es ist zu arbeiten, da aList noch eine Liste ist. Sie müssen nur diese Art und Weise zu

if sum(val['age'] for val in combo) == target: 

die, wenn die Bedingung ändern, um Ihre ‚Ergebnisse‘ Variable aller Kombinationen der Wörterbuch-Elemente aus aList, für die Alters Summen bis zu dem Zielwert bestehen.

0

Als Ihre Funktion für eine Liste arbeitet, so extrahieren nur eine Liste der Zeiten aus der Liste der dicts aList, und dann Funktion verwenden.

list_dicts = [{'name': 'Hailey', 'age': 20, 'id': 48479}, 
       {'name': 'John', 'age': 40, 'id': 18021}, 
       {'name': 'Asger', 'age': 18, 'id': 22281}] 

list_ages = [d['age'] for d in list_dicts] 

print(list_ages) 
# Output 
[20, 40, 18]