我有这本词典。
'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新手在这里。任何有关如何做到这一点的帮助将不胜感激!我被困在这一段时间了。感谢。
答案 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)