【发布时间】:2016-03-26 17:29:28
【问题描述】:
目标:表达的工作类似物
{k1: v1, k2: v2 for k1, k2, v1, v2 in data}
或更具体的情况{k1: v, k2: v for k1, k2, v, _ in data}
仅迭代data 1 次(在给定的示例中,data 是 4 元组的可迭代对象)。
(以及关于列表理解的类似问题,例如[myfunc1(v1), myfunc2(v2) for v1, v2 in data])。
我只能假设使用自己的迭代器的解决方案:
def getby(iterable_data, iterable_indexes):
for indexed_data in iterable_data:
for tupl in iterable_indexes:
yield tuple(indexed_data[ind] for ind in tupl)
raise StopIteration
工作示例:list(getby([('a', 'b', 'c'), ('d', 'e', 'f', 'g')], [(0, 1), (2, 1)])) 返回[('a', 'b'), ('c', 'b'), ('d', 'e'), ('f', 'e')]。
但可能它很慢。
我也可以假设上面的 itertools.chain 和 itertools.groupby 的等价表达式:
list(chain.from_iterable(lst for lst, _ in groupby([('a', 'b', 'c'), ('d', 'e', 'f', 'g')],
lambda lst: [(lst[0], lst[1]), (lst[2], lst[1])])))
但可能很丑。
基于 ipython 的两个解决方案的比较:第一个 1000 次循环,最好的 3:20.2 ms 每个循环,第二个 1000 次循环,最好的 3 : 4.12 ms 每个循环,所以第二个解决方案确实更快。但也许存在更优雅的解决方案?
【问题讨论】:
-
可能是
{k: v for k1, k2, v1, v2 in data for k, v in ((k1, v1), (k2, v2))}?特殊情况:{k: v for k1, k2, v, _ in data for k in (k1, k2)}. -
@Delgan,当然!这是一个非常优雅的解决方案,运行速度稍快!谢谢!
-
没问题,别忘了接受@Martijn的解决方案。 ;)
标签: python python-3.x list-comprehension dictionary-comprehension