Im Moment habe ich Probleme herauszufinden, wie ich die folgende Ausgabe erhalten kann.

Gewünschte Ausgabe:

 {'Bobby':  [set(), set(), set(), {'movie_2'}, set(),{'movie_1'}], 
  'Carren': [set(), set(), {'movie_4'}, {'movie_2'}, set(), {'movie_1'}],
  'Deric':  [set(), {'movie_1'}, set(), {'movie_2'}, set(),{'movie_3'}],
  'Alec':   [set(), {'movie_1'}, {'movie_3'}, set(), set(), {'movie_4'}] }

Das Wörterbuch, mit dem ich arbeite:

d = {'movie_1': {('Bobby', 5), ('Carren', 5), ('Alec', 1), ('Deric', 1)},
     'movie_2': {('Carren', 3), ('Deric', 3), ('Bobby', 3)},
     'movie_3': {('Alec', 2), ('Deric', 5)},
     'movie_4': {('Carren', 2), ('Alec', 5)} }

Innerhalb jedes Wertes repräsentiert das Tupel (Person, Position).

Wenn Sie also im Wörterbuch d den Schlüssel 'movie_1' betrachten, ist der erste Wert ('Bobby', 5).

Dann wird der Schlüssel 'movie_1' in den 5. Index der Liste eingefügt.

Der Code, den ich bisher habe:

Ich habe eine Liste mit 6 Elementen von set() erstellt, bin mir aber nicht ganz sicher, was ich von hier aus tun soll, um die gewünschte Ausgabe zu erhalten.

from collections import defaultdict

d = {
    'movie_1': {('Bobby', 5), ('Carren', 5), ('Alec', 1), ('Deric', 1)},
    'movie_2': {('Carren', 3), ('Deric', 3), ('Bobby', 3)},
    'movie_3': {('Alec', 2), ('Deric', 5)},
    'movie_4': {('Carren', 2), ('Alec', 5)},
}

def new_dict(d):
    le_dict = defaultdict(set)
    values = [set(), set(), set(), set(), set(), set()]
    for key, value in d.items():
        for person_score in value:
            le_dict[person_score[0]].add(key)   
    return le_dict
3
user10583992 18 Jän. 2019 im 06:48

3 Antworten

Beste Antwort

Ich würde empfehlen, den Max-Index direkt aus Ihren Eingabedaten zu berechnen, anstatt ihn fest zu codieren.

from collections import defaultdict

def setlist(size):
    def gen():
        return [set() for _ in range(size)]
    return gen

def get_max_index(d):
    return max(score for ranking in d.values() for _, score in ranking)

def rearrange(d, max_index=None):
    if max_index is None:
        max_index = get_max_index(d)
    output = defaultdict(setlist(max_index + 1))
    for movie, ranking in d.items():
        for person, score in ranking:
            output[person][score].add(movie)
    return output

Hier ist ein IDEOne-Link: https://ideone.com/83v6MN

3
Mad Physicist 18 Jän. 2019 im 04:26

Die Einfügemethode der Liste kann wie folgt überschrieben werden, um eine generische Implementierung zu erhalten. Es ist nicht erforderlich, die maximale Größe oder den harten Code zu finden.

from collections import defaultdict

d = {'movie_1': {('Bobby', 5), ('Carren', 5), ('Alec', 1), ('Deric', 1)},
     'movie_2': {('Carren', 3), ('Deric', 3), ('Bobby', 3)}, 'movie_3': {('Alec', 2), ('Deric', 5)},
     'movie_4': {('Carren', 2), ('Alec', 5)}}


class myList(list):

    def insert(self, index, obj):
        if len(self) <= index:
            for i in range(len(self), index):
                self.append(type(obj)())
            self.append(obj)
        else:
            self[index] = obj


def new_dict(d):
    le_dict = {}

    for key, value in d.items():
        for name, index in value:
            if name not in le_dict:
                le_dict[name] = myList()
            le_dict[name].insert(index, set([key]))

    return le_dict


print(new_dict(d))
0
Ajay Srivastava 19 Jän. 2019 im 08:28
d = {'movie_1': {('Bobby', 5), ('Carren', 5), ('Alec', 1), ('Deric', 1)}, 'movie_2': {('Carren', 3), ('Deric', 3), ('Bobby', 3)}, 'movie_3': {('Alec', 2), ('Deric', 5)}, 'movie_4': {('Carren', 2), ('Alec', 5)} }

def new_dict(d):
    le_dict = {}
    for key, values in d.items():
        for person, score in values:
            if person not in le_dict:
                le_dict[person] = [set(), set(), set(), set(), set(), set()]
            le_dict[person][score].add(key)
    return le_dict

new_dict(d)

Das Ergebnis:

{'Bobby': [set(), set(), set(), {'movie_2'}, set(), {'movie_1'}],
 'Alec': [set(), {'movie_1'}, {'movie_3'}, set(), set(), {'movie_4'}],
 'Carren': [set(), set(), {'movie_4'}, {'movie_2'}, set(), {'movie_1'}],
 'Deric': [set(), {'movie_1'}, set(), {'movie_2'}, set(), {'movie_3'}]}
2
keineahnung2345 19 Jän. 2019 im 07:27