增加dict中的值

时间:2014-03-07 17:19:08

标签: python python-2.7 python-3.x dictionary

我有这本词典。

'Frank': {'Jack': 0, 'Kevin': 0, 'Sam': 0}
'Sam': {'Frank': 0, 'Jack': 0, 'Kevin': 0}
'Kevin': {'Frank': 0, 'Jack': 0, 'Sam': 0}
'Jack': {'Frank': 0, 'Kevin': 0, 'Sam': 0}

我有变量扬声器和听众。扬声器是字典的名称,并且监听器可以是字典中的键之一。例如'Frank'是演讲者,'Jack','Sam'和'Kevin'可以成为第一个dict创建的听众。我希望能够增加特定侦听器的值。例如,如果发言者='Sam'和聆听者='Kevin',我希望这种情况发生

'Sam': {'Frank': 0, 'Jack': 0, 'Kevin': 1}

反之亦然

'Kevin': {'Frank': 0, 'Jack': 0, 'Sam': 1}

编程和python新手在这里。任何有关如何做到这一点的帮助将不胜感激!我被困在这一段时间了。感谢。

3 个答案:

答案 0 :(得分:3)

看看这个:

d = {
'Frank': {'Jack': 0, 'Kevin': 0, 'Sam': 0},
'Sam': {'Frank': 0, 'Jack': 0, 'Kevin': 0},
'Kevin': {'Frank': 0, 'Jack': 0, 'Sam': 0},
'Jack': {'Frank': 0, 'Kevin': 0, 'Sam': 0} }

d ['Frank'] ['Kevin'] += 1

print (d)

d['Frank']是Frank的听众字典,d['Frank']['Kevin']是Kevin听Frank多少次。你可以增加这个值。

或者如果说话者 - 听众关系是对称的,你可以试试这个:

def talk (speaker, listener, data):
    data[speaker][listener] += 1
    data[listener][speaker] += 1

d = {
'Frank': {'Jack': 0, 'Kevin': 0, 'Sam': 0},
'Sam': {'Frank': 0, 'Jack': 0, 'Kevin': 0},
'Kevin': {'Frank': 0, 'Jack': 0, 'Sam': 0},
'Jack': {'Frank': 0, 'Kevin': 0, 'Sam': 0} }

talk('Frank', 'Sam', d)

print(d)

答案 1 :(得分:1)

说实话,我可能会创建一个新的Person对象。

class Person(object):
    def __init__(self,name):
        self.name = name
    def speak(self,other):
        for (speaker,listener) in ((self,other),(other,self)):
            try: speaker.__dict__[listener.name] += 1
            except KeyError: speaker.__dict__[listener.name] = 1
    @property
    def listeners(self):
        return {name:value for name,value in self.__dict__.items() if name != "name"}

## DEMO
>>> Adam = Person("Adam")
>>> Steve = Person("Steve")
>>> Adam.speak(Steve)
>>> Adam.Steve
1
>>> Steve.Adam
1
>>> Paul = Person("Paul")
>>> for listener in [Adam,Steve]:
        Paul.speak(listener)
>>> Paul.listeners
{"Adam":1, "Steve":1}

答案 2 :(得分:0)

另一种方法,模仿@ adsmith的回答,但避免篡改__dict__,从而允许所有可能的人名。

class Person:
    directional = False

    def __init__(self, name):
        self.name = name
        self.listeners = {}

    def speak(self, other):
        try: self.listeners[other] += 1
        except KeyError: self.listeners[other] = 1
        if Person.directional: return
        try: other.listeners[self] += 1
        except KeyError: other.listeners[self] = 1

    def __getitem__(self, person):
        try: return self.listeners[person]
        except KeyError: return 0

    def __repr__(self):
        return self.name

样本用法:

alice = Person('Alice')
bob = Person('Bob')
charles = Person('Charles')

alice.speak(bob)
alice.speak(bob)
bob.speak(charles)

print(alice[bob])
print(alice[charles])
print(alice[bob])
print(bob.listeners)