如果我有一个列表,例如:
courses = [{name: a, course: math, count:1}]
如果我再次输入姓名:一门课程:数学列表将是
courses = {name: a, course: math, count:2}
我只希望具有相同名称的项目,而且课程不会追加到列表中,而只会增加“计数”关键项目。
我尝试过:
def add_class(inputname,inputcourse):
for i in (len(courses)):
if courses[i]['name']== inputname and courses[i]['course']==inputcourse:
courses[i][count]+=1
else :
newdata = {"name":inputname, "course":inputcourse,count:1}
#i put count because this item is the first time.
courses.append(newdata)
print courses
我希望输出为class = {name: a, course: math, count:2}
,但实际输出为class = [{name: a, course: math, count:2},{name: a, course: math, count:1}]
如果我输入了新的数据,例如name:a,当然:physic,输出将是
[{name:a,course:physic,count:1},{name: a, course: math, count:2},{name: a, course: math, count:1}]
答案 0 :(得分:2)
我可以建议您使用其他方法吗?
在您的情况下,与其使用可能难以管理的字典列表,而是编写自己的类来存储“名称”和“课程”。
class NC:
def __init__(self, n, c):
self.name = n
self.course = c
def __hash__(self):
return hash((self.name, self.course))
def __eq__(self, other):
if self.__hash__() == other.__hash__():
return True
else:
return False
def __repr__(self):
return "[{}: {}]".format(self.name, self.course)
通过定义特殊方法__hash__
和__eq__
,您可以使对象可散列,以便Counter可以对它们进行计数。
如果您这样写:
from collections import Counter
a = NC("a", "math")
b = NC("b", "physics")
c = NC("a", "math")
l = [a, b, c]
lc = Counter(l)
print lc
print
将为您提供Counter({[a: math]: 2, [b: physics]: 1})
使用这种方法,您可以将所有NC
对象附加到列表中,最后使用Counter获得重复。
编辑。
要“实时”执行相同操作,您可以创建一个空计数器,然后对其进行更新。
from collections import Counter
lc = Counter()
lc.update([NC("a", "math")])
print lc #this prints: Counter({[a: math]: 1})
lc.update([NC("b", "physics")])
print lc #this prints: Counter({[a: math]: 1, [b: physics]: 1})
lc.update([NC("a", "math")])
print lc #this prints: Counter({[a: math]: 2, [b: physics]: 1})
请记住,Counter.update
需要一个可迭代的元素,因此,如果要向Counter添加一个元素,则必须输入一个包含该元素的列表。当然,您还可以向gheter添加更多元素,例如:lc.update([NC("b", "physics"), NC("c", "chemistry")])
有效,并且两个对象都添加到计数器中。
答案 1 :(得分:1)
您可以使用for else子句。仅当未达到中断时,才会调用else部分,这是为您提供的示例
courses = []
courses.append({'name': 'a', 'course': 'math', 'count': 1})
def add_course(d):
for course in courses:
if course['course'] == d['course'] and course['name'] == d['name']:
course['count'] += 1
break
else:
d['count'] = 1
courses.append(d)
add_course({'name': 'a', 'course': 'math'})
add_course({'name': 'a', 'course': 'english'})
print(courses)
作为输出,您有[{'name': 'a', 'course': 'math', 'count': 2}, {'name': 'a', 'course': 'english', 'count': 1}]