在 Python 中选择打印输出的特定结果 - 2.7
Selecting specific results from print out in Python - 2.7
我希望从下面打印的代码中获取三个最新的(基于时间)列表。这些不是实际文件,而是解析并存储在字典中的文本:
list4 = sorted(data1.values(), key = itemgetter(4))
for complete in list4:
if complete[1] == 'Completed':
print complete
returns:
['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']]
所以,
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
被告知(通过它的第二个参数)只产生它作为第一个参数接收的 iterable 的第一个最多 3 个项目。一旦完成,它就会停止循环,不再做任何进一步的工作(这将是无用的)。
我们确实需要对这一切调用 list
,因为我们因此需要一个列表,而不是迭代器(islice
的结果是)。
对生成器和迭代器感到不舒服的人可能会选择以下不太优雅、可能性能较差但更简单的方法:
storage = []
for c in list4:
if c[1]=='Completed':
storage.append(c)
if len(c) == 3: break
这也是完全有效的 Python(如果不是更早的话,早在 Python 1.5.4 之前它就可以正常工作)。但是现代 Python 用法更倾向于生成器、迭代器和 itertools
,在适用的情况下...
我希望从下面打印的代码中获取三个最新的(基于时间)列表。这些不是实际文件,而是解析并存储在字典中的文本:
list4 = sorted(data1.values(), key = itemgetter(4))
for complete in list4:
if complete[1] == 'Completed':
print complete
returns:
['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']]
所以,
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
被告知(通过它的第二个参数)只产生它作为第一个参数接收的 iterable 的第一个最多 3 个项目。一旦完成,它就会停止循环,不再做任何进一步的工作(这将是无用的)。
我们确实需要对这一切调用 list
,因为我们因此需要一个列表,而不是迭代器(islice
的结果是)。
对生成器和迭代器感到不舒服的人可能会选择以下不太优雅、可能性能较差但更简单的方法:
storage = []
for c in list4:
if c[1]=='Completed':
storage.append(c)
if len(c) == 3: break
这也是完全有效的 Python(如果不是更早的话,早在 Python 1.5.4 之前它就可以正常工作)。但是现代 Python 用法更倾向于生成器、迭代器和 itertools
,在适用的情况下...