从lis中选择打印

2024-05-23 18:05:07 发布

您现在位置:Python中文网/ 问答频道 /正文

举个例子,我有一个这样的列表:

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'

我正在用它来编字典。你知道我怎么做吗?提前谢谢你的帮助。干杯!!在


Tags: 用户列表字典johnheplist例子short
3条回答

对于formatDate,它可能更复杂,但是对于简单的等式,可以使用eval:

test_string = "username == 'John Dee' && queue == 'short'"

for a, b, username, formatDate, d, e, f, queue, g, h in q_list:
    if eval(test_string.replace('&&', 'and')):
        print '%s: %s' % (username, queue)

您可以通过替换“| |”来生成“或”语句,这是相当动态的

别忘了用引号括起来(不是queue == short而是queue == 'short'

给定q_列表的结果是:

^{pr2}$

最常见的方法是使用list comprehension,例如按用户名筛选:

[x for x in q_list if x[2] == 'John Dee']

您还可以使用^{}

^{pr2}$

因此,您可以使用q_dict轻松地按用户和/或队列进行筛选。在

[x for x in q_list if [x[2].lower().replace(' ', ''), x[7]] == q_dict.values()]

正如Space_C0wb0y's answer中建议的那样,使用^{}将是一个不错的方法,您可以相当容易地映射出字段:

fields =  ['field1', 'field2', 'username', 'field4', 'field5', 'field6', 'field7', 'queue', 'field9', 'field10']
Item = namedtuple('Item', fields)

为了便于讨论,让我们将列表中的元组转换为namedtuples:

q_namedtuple = [Item(*x) for x in q_list]

然后可以根据查询参数动态过滤。例如,要获取所有查询参数与给定字段匹配的项列表:

[item for item in q_namedtuple if all(getattr(item, k) == v for k, v in q_dict.iteritems())]

假设q_dict中的用户名实际上与用户名字段匹配……在您的示例中没有,但是您可以解决这个问题。类似地,您可以创建一个dict列表,这会使处理列表更容易:

q_list_of_dicts = [dict(zip(fields, x)) for x in q_list]

这会给你一个诸如:

{'field1': '102.vmtest2',
 ...etc
 'queue': 'short',
 'username': 'John Dee'}

然后您可以类似地过滤:

[item for item in q_list_of_dicts if all(item.get(k) == v for k, v in q_dict.iteritems())]

我个人认为我更喜欢dict方法。使用for循环(和一个生成器表达式)完成了全部工作:

results = []
for item in q_list:
    d = dict(zip(fields, item))
    # use some other logic to filter
    if all(d.get(k) == v for k, v in q_dict.iteritems()):
         results.append(d)

首先,我建议您将数据存储在namedtuples或自定义类中,而不仅仅是原始元组。这样您就可以按名称访问属性(例如使用operator.attrgetter)。另一个选择是使用dict。在

然后,您可以简单地执行以下操作(假设您的项目是dicts):

[item for item in q_list if all((item[attr] == q_dict[attr]) 
                                 for q_dict in filters)]

当然,只有当你的条件总是遵循问题中显示的模式(不||,不!=或类似的东西)时,这才有效。在

如果只能使用元组,则可以创建一个将属性名称映射到元组索引的字典。在

现在,当您打印它们时,您只需创建一个应该打印的属性列表,并按如下方式使用它:

^{pr2}$

相关问题 更多 >