【发布时间】:2011-10-16 18:09:52
【问题描述】:
是否有任何优雅的方法可以在 python 中将一个列表/字典拆分为两个列表/字典,并采用一些任意拆分器函数?
我可以轻松拥有两个列表推导或两个选择,但在我看来应该有更好的方法来避免对每个元素进行两次迭代。
我可以使用 for 循环和 if 语句轻松完成此操作,但这需要 7 行代码来完成本应非常简单的操作。
有什么想法吗?
编辑:
仅供参考,我的两个解决方案是,
# given dict cows, mapping cow names to weight
# fast solution
fatcows = {}
thincows = {}
for name, weight in cows:
if weight < 100:
thincows[name] = weight
else:
fatcows[name] = weight
# double-list-comprehension solution would be
fatcows = {name: weight for name, weight in cows.items() if weight > 100}
thincows = {name: weight for name, weight in cows.items() if weight < 100}
我在想一定有比这更优雅的东西,我从来没有想过,比如:
thincows, fatcows = ??? short expression involving cows ???
我知道可以通过编写高阶函数来为我做这件事,而且我知道如何手动做。我只是想知道是否有一些超级优雅的语言功能可以为我做这件事。
这就像你可以编写自己的子例程和诸如在列表上执行 SELECT 之类的东西,或者你可以直接说
thincows = select(cows, lambda c: c.weight < 100)
我希望有一些类似的优雅方式拆分列表,一次通过
【问题讨论】:
-
你能举一个你提到的任意分割函数的例子吗?更好的是,展示一个你想加强的例子。
-
你能添加你的七行代码吗?
-
滚动浏览答案,很震惊没有看到 itertools.ifilter——我认为我误解了(另一个)itertools 函数,因为你的问题听起来像是另一个“有没有更好的方法来做(在此处插入由我重新制作的 itertools 函数)?”,这似乎出现了很多。但是看到底部超级用户对此的回答,我松了一口气。您应该接受 adam Rosenfeld 的回答,因为它是 python 标准库的方式来做您想做的事。 Gratz 为您的第一个问题提出了一个如此受欢迎的问题!
标签: python select dictionary list-comprehension