【发布时间】:2019-12-16 21:04:54
【问题描述】:
我是 Python 新手,请多多包涵。 sn-p 来自“Python 食谱”一书,关于如何从不可散列的集合中删除重复数据。
def dedup(items, key=None):
seen = set()
for item in items:
val = item if key is None else key(item)
if val not in seen:
yield val
seen.add(val)
if __name__ == '__main__':
a = [{'x':1, 'y':2}, {'x':1, 'y':3}, {'x':1, 'y':2}, {'x':2, 'y':4}]
print(list(dedup(a, key=lambda d:(d['x'],d['y']))))
测试时,根据“key”的定义,结果显示为:
a = [ {'x':1, 'y':2}, {'x':1, 'y':3}, {'x':1, 'y':2}, {'x':2, 'y':4}]
>>> list(dedupe(a, key=lambda d: (d['x'],d['y'])))
[{'x': 1, 'y': 2}, {'x': 1, 'y': 3}, {'x': 2, 'y': 4}]
>>> list(dedupe(a, key=lambda d: d['x']))
[{'x': 1, 'y': 2}, {'x': 2, 'y': 4}]
现在是问题:
- 在dedup函数中,过滤后的结果似乎保存在set中,当item从list移动到set时,list的顺序是如何保持的?
- 函数中没有使用显式返回语句,是否意味着隐式返回集合“seen”?
- 您能解释一下测试中的两个 lambda 定义吗?从结果来看,第一个似乎同时检查了 dict 类型的 k 和 v,而后者只检查了 dict 的键是否重复。
【问题讨论】:
-
集合
seen不返回,对返回东西的顺序没有影响;它纯粹在内部用于检查重复项。
标签: python data-structures lambda generator yield