我希望从下面的打印代码中获取最新的三个(基于时间的)列表。这些不是实际文件,而是解析并存储在字典中的文本:
list4 = sorted(data1.values(), key = itemgetter(4))
for complete in list4:
if complete[1] == 'Completed':
print complete返回:
['aaa664847', ' Completed', ' location' , ' mode', ' 2014-xx-ddT20:00:00.000']
['aaa665487', ' Completed', ' location' , ' mode', ' 2014-xx-ddT19:00:00.000']
['aaa661965', ' Completed', ' location' , ' mode', ' 2014-xx-ddT18:00:00.000']
['aaa669696', ' Completed', ' location' , ' mode', ' 2014-xx-ddT17:00:00.000']
['aaa665376', ' Completed', ' location' , ' mode', ' 2014-xx-ddT16:00:00.000']我试图将这些结果附加到另一个列表中:
[['aaa664847', ' Completed', ' location' , ' mode', ' 2014-xx-ddT20:00:00.000']]
[['aaa665487', ' Completed', ' location' , ' mode', ' 2014-xx-ddT19:00:00.000']]我想要一个清单,然后我可以使用-3:打印出三个最近的。
storage = [['aaa664847', ' Completed', ' location' , ' mode', ' 2014-xx-ddT20:00:00.000'],['aaa665487', ' Completed', ' location' , ' mode', ' 2014-xx-ddT19:00:00.000']]发布于 2015-01-24 01:05:10
所以,
import itertools
storage = list(itertools.islice((c for c in list4 if c[1]=='Completed'), 3))也许.
补充说:一个解释可能会有帮助。(c for c in list4 if c[1]=='Completed')部分是一个生成器表达式("genexp") --它从一开始就遍历list4,并且只一次产生满足条件的项(子列表)。
它周围的()是必需的,因为itertools.islice需要另一个参数( genexp必须始终被括号包围,但是当它是可调用的唯一的参数时,调用可调用的括号就足够了,不需要重复使用)。
islice被告知(通过其第二个参数)只产生作为第一个参数的可迭代性的前三个项。一旦它完成,它停止循环,不再做进一步的工作(这将是无用的)。
我们确实需要在这一切上调用list,因为我们因此需要一个列表,而不是迭代器(这就是islice的结果)。
对生成器和迭代器感到不舒服的人可能会选择以下不那么优雅、性能可能较差但更简单的方法:
storage = []
for c in list4:
if c[1]=='Completed':
storage.append(c)
if len(c) == 3: break这也是完全有效的Python (如果不是更早的话,它可以很好地工作到Python1.5.4)。但在适用的情况下,现代Python的使用更倾向于生成器、迭代器和itertools。
https://stackoverflow.com/questions/28121158
复制相似问题