找到特定字典键具有特定值的所有行

时间:2017-10-25 20:05:50

标签: python list dictionary

我想找到特定dict键具有特定值的所有行。 不太清楚这样说,所以这里有一个例子:

data = [
    {'key1' : 'value1', 'key2' : 'value2'},
    {'key1' : 'value3', 'key2' : 'value4'},
    {'key1' : 'value1', 'key2' : 'value5'}
]

out = data['key1' == 'value1']['key2']

我希望out等于['value2', 'value5'],但实际上它只返回第一个结果,即'value2'

1 个答案:

答案 0 :(得分:5)

Vanilla 列表和词典

您可以使用 list comprehension

   [d['key2'] for d in data if d['key1'] == 'value1']
#   \___ ___/ \_____ _____/ \___________ __________/
#       v           v                   v
#     yield      iterator              filter

(注释仅用于使语法更容易理解)

所以我们迭代data d是迭代器。我们会检查是否d['key1'] == 'value1',如果是这种情况,我们会在结果列表中添加d['key2']

熊猫

Pandas是一个允许处理(大)数据帧的包。尽管数据框架可以非常灵活,但基本(因而不是完全正确的)定义是将其视为2d表,其中每行具有相同的命名列。您可以使用以下命令安装pandas:

pip3 install pandas

(或pip install pandas

接下来我们可以通过导入它来使用pandas:

import pandas as pd

接下来,我们可以创建一个数据框:

df = pd.DataFrame(data)

这将是:

>>> df
     key1    key2
0  value1  value2
1  value3  value4
2  value1  value5

现在,我们可以获得Serieskey2 key1 'value1'df[df['key1'] == 'value1']['key2'] 的值{/ p>

>>> df[df['key1'] == 'value1']['key2']
0    value2
2    value5
Name: key2, dtype: object

这会产生:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog" />
  </configSections>
  <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/>
  </startup>
  <nlog autoReload="true" internalLogFile="log/internal.txt" internalLogLevel="Trace">
    <variable name="brief" value="${longdate} ${level} ${logger} ${message}${onexception:inner= ${exception:format=toString,Data}} "/>
    <variable name="verbose" value="${longdate} | ${machinename} | ${processid} | ${processname} | ${level} | ${logger} | ${message}${onexception:inner= ${exception:format=toString,Data}}"/>
    <targets>
      <target name="console" type="Console" layout="${brief}"/>
      <target name="all_in" type="File" layout="${verbose}" fileName="${basedir}/log/log.txt" archiveFileName="${basedir}/log/archive/log.{#}.txt" archiveNumbering="DateAndSequence" archiveAboveSize="1048576" archiveDateFormat="yyyyMMdd" keepFileOpen="false" encoding="iso-8859-2"/>
      <target name="events" type="EventLog" layout="${verbose}" source="nlog-test" onOverflow="Split"/>
    </targets>
    <rules>
      <logger name="*" minlevel="Info" writeTo="console"/>
      <logger name="*" minlevel="Trace" writeTo="all_in"/>
      <logger name="*" minlevel="Fatal" maxlevel="Error" writeTo="events"/>
    </rules>
  </nlog>
</configuration>

对于一个简单的结果来说当然有很多工作要做,但是pandas可以用来在大型数据集的合理时间内完成复杂的查询。