这可以通过使用支持的
dict
相对高效地完成:
def split_by_idx(items, idx=1):
result = {}
for item in items:
key = item[idx]
if key not in result:
result[key] = []
result[key].append(item)
return result
可以使用dict.values()
函数从result
中收集列表:
lst = [("hello", "Blue"), ("hi", "Red"), ("hey", "Blue"), ("yo", "Green")]
d = split_by_idx(lst)
print(list(d.values()))
这也可以用
dict.setdefault()
或者
defaultdict
实现,两者基本相同,不同之处在于
defaultdict
不需要显式处理“键不存在”的情况。
def split_by_idx_sd(items, idx=1):
result = {}
for item in items:
result.setdefault(item[idx], []).append(item)
return result
import collections
def split_by_idx_dd(items, idx=1):
result = collections.defaultdict(list)
for item in items:
result[item[idx]].append(item)
return result
就时间而言,基于 dict
的解决方案对于您的输入速度最快:
%timeit split_by_idx(lst)
# 1000000 loops, best of 3: 776 ns per loop
%timeit split_by_idx_sd(lst)
# 1000000 loops, best of 3: 866 ns per loop
%timeit split_by_idx_dd(lst)
# 1000000 loops, best of 3: 1.16 µs per loop
但是根据您输入的"冲突率",您将获得不同的时序。通常情况下,在低冲突率(即大多数条目会创建dict
的新元素)下,split_by_idx()
应该是最快的,而在高冲突率下(即大多数条目附加到现有的defaultdict
键上),split_by_idx_dd()
应该是最快的。