我试图在列表中提取所有字典的集合,以便对集合中dict1 is dict2 == False的任何两个字典.字典列表不能通过使用缩减为集合,set()因为它们不可清除.我意识到我可以做到以下几点:
dictlist = [.....]
setlist = []
for d in dictlist:
if all(s is not d for s in setlist):
setlist.append(d)
Run Code Online (Sandbox Code Playgroud)
有没有内置的python(使用c,速度更快)类似于set()来减少列表,只需要不需要hashable?
如果要比较标识,则存储每个字典的id()函数结果:
seen = set()
unique = [d for d in dictlist if id(d) not in seen and not seen.add(id(d))]
Run Code Online (Sandbox Code Playgroud)
要么
unique = {id(d): d for d in dictlist}.values()
Run Code Online (Sandbox Code Playgroud)
这消除了基于对象标识的重复,而不是内容的相等.第一种形式维持秩序,第二种形式不维持(就像一种set()意愿).
为了相等,键值对的序列是可清除的(如果所有值都是可清除的); 其中一个frozenset()将作为测试内容唯一性的关键:
seen = set()
hashable = lambda d: frozenset(d.items())
unique = [d for d in dictlist if hashable(d) not in seen and not seen.add(hashable(d))]
Run Code Online (Sandbox Code Playgroud)
对于订单保留列表或:
unique = {frozenset(d.items()): d for d in dictlist}.values()
Run Code Online (Sandbox Code Playgroud)
如果订单不重要.
| 归档时间: |
|
| 查看次数: |
98 次 |
| 最近记录: |