举个例子,我有一个这样的列表:
q_list = [('94.vmtest2', 'sgmops', 'Andy Hays', '27/04 00:27:26', 'C', '27/04 00:28:31', 'vmtest1.hep', 'express', '00:00:10', '00:01:04'),
('96.vmtest2', 'sgmops', 'John Dee', '27/04 01:27:26', 'C', '27/04 01:28:33', 'vmtest1.hep', 'short', '00:00:09', '00:01:06'),
('99.vmtest2', 'sgmops', 'Andy Hays', '27/04 07:19:56', 'C', '27/04 07:21:12', 'vmtest1.hep', 'express', '00:00:10', '00:01:14'),
('103.vmtest2', 'sgmops', 'John Dee', '27/04 14:08:00', 'C', '27/04 14:09:16', 'vmtest1.hep', 'express', '00:00:10', '00:01:16'),
('102.vmtest2', 'sgmops', 'John Dee', '27/04 14:02:38', 'C', '27/04 14:10:12', 'vmtest1.hep', 'short', '00:00:10', '00:01:10')]
它是由日志文件形成的。然后我有一本这样的字典:
^{pr2}$它由查询字符串(用户输入)组成。我想要的是打印列表中与字典中的值匹配的[前8项]。在这种情况下,我只打印这两行:
96.vmtest2 sgmops John Dee 27/04 01:27:26 C 27/04 01:28:33 vmtest1.hep short
102.vmtest2 sgmops John Dee 27/04 14:02:38 C 27/04 14:10:12 vmtest1.hep short
实际上,它根本不必是字典;用户输入(命令行参数)如下所示:
'formatDate(%m/%d) == 4/27 && username == John Dee && queue == short'
我正在用它来编字典。你知道我怎么做吗?提前谢谢你的帮助。干杯!!在
对于formatDate,它可能更复杂,但是对于简单的等式,可以使用eval:
您可以通过替换“| |”来生成“或”语句,这是相当动态的
别忘了用引号括起来(不是
queue == short
而是queue == 'short'
)给定q_列表的结果是:
^{pr2}$最常见的方法是使用list comprehension,例如按用户名筛选:
您还可以使用^{} :
^{pr2}$因此,您可以使用
q_dict
轻松地按用户和/或队列进行筛选。在正如Space_C0wb0y's answer中建议的那样,使用^{} 将是一个不错的方法,您可以相当容易地映射出字段:
为了便于讨论,让我们将列表中的元组转换为namedtuples:
然后可以根据查询参数动态过滤。例如,要获取所有查询参数与给定字段匹配的项列表:
假设
q_dict
中的用户名实际上与用户名字段匹配……在您的示例中没有,但是您可以解决这个问题。类似地,您可以创建一个dict列表,这会使处理列表更容易:这会给你一个诸如:
然后您可以类似地过滤:
我个人认为我更喜欢dict方法。使用for循环(和一个生成器表达式)完成了全部工作:
首先,我建议您将数据存储在
namedtuple
s或自定义类中,而不仅仅是原始元组。这样您就可以按名称访问属性(例如使用operator.attrgetter
)。另一个选择是使用dict
。在然后,您可以简单地执行以下操作(假设您的项目是
dict
s):当然,只有当你的条件总是遵循问题中显示的模式(不
||
,不!=
或类似的东西)时,这才有效。在如果只能使用元组,则可以创建一个将属性名称映射到元组索引的字典。在
现在,当您打印它们时,您只需创建一个应该打印的属性列表,并按如下方式使用它:
^{pr2}$相关问题 更多 >
编程相关推荐