如何删除列表中的重复项?

时间:2018-12-30 16:31:52

标签: python

如果我有一个列表,例如:

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}]

2 个答案:

答案 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}]