<p>最常见的方法是使用<a href="http://docs.python.org/tutorial/datastructures.html#list-comprehensions" rel="nofollow noreferrer">list comprehension</a>,例如按用户名筛选:</p>
<pre><code>[x for x in q_list if x[2] == 'John Dee']
</code></pre>
<p>您还可以使用<a href="http://docs.python.org/library/functions.html#filter" rel="nofollow noreferrer">^{<cd1>}</a>:</p>
^{pr2}$
<p>因此,您可以使用<code>q_dict</code>轻松地按用户和/或队列进行筛选。在</p>
<pre><code>[x for x in q_list if [x[2].lower().replace(' ', ''), x[7]] == q_dict.values()]
</code></pre>
<p>正如<a href="https://stackoverflow.com/questions/6088698/selective-printing-from-a-list/6089057#6089057">Space_C0wb0y's answer</a>中建议的那样,使用<a href="http://docs.python.org/library/collections.html#namedtuple-factory-function-for-tuples-with-named-fields" rel="nofollow noreferrer">^{<cd3>}</a>将是一个不错的方法,您可以相当容易地映射出字段:</p>
<pre><code>fields = ['field1', 'field2', 'username', 'field4', 'field5', 'field6', 'field7', 'queue', 'field9', 'field10']
Item = namedtuple('Item', fields)
</code></pre>
<p>为了便于讨论,让我们将列表中的元组转换为namedtuples:</p>
<pre><code>q_namedtuple = [Item(*x) for x in q_list]
</code></pre>
<p>然后可以根据查询参数动态过滤。例如,要获取所有查询参数与给定字段匹配的项列表:</p>
<pre><code>[item for item in q_namedtuple if all(getattr(item, k) == v for k, v in q_dict.iteritems())]
</code></pre>
<p>假设<code>q_dict</code>中的用户名实际上与用户名字段匹配……在您的示例中没有,但是您可以解决这个问题。类似地,您可以创建一个dict列表,这会使处理列表更容易:</p>
<pre><code>q_list_of_dicts = [dict(zip(fields, x)) for x in q_list]
</code></pre>
<p>这会给你一个诸如:</p>
<pre><code>{'field1': '102.vmtest2',
...etc
'queue': 'short',
'username': 'John Dee'}
</code></pre>
<p>然后您可以类似地过滤:</p>
<pre><code>[item for item in q_list_of_dicts if all(item.get(k) == v for k, v in q_dict.iteritems())]
</code></pre>
<p>我个人认为我更喜欢dict方法。使用for循环(和一个生成器表达式)完成了全部工作:</p>
<pre><code>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)
</code></pre>