使用函数从词典列表中提取值

时间:2019-08-31 01:08:48

标签: python python-3.x

我有一个简单的字典清单,如下所示。

data_records = [{'client': 'AAA',
                    'keys': ['k001', 'k002'],
                    'server_name': 'server00',
                    'db_name': 'db-aaa',
                    },
                   {'client': 'BBB',
                    'keys': [],
                    'server_name': 'server01',
                    'db_name': 'db-bbb',
                    },
                   {'client': 'CCC',
                    'keys': ['k003', 'k004', 'k005', 'k006'],
                    'server_name': 'server02',
                    'db_name': 'db-ccc',
                    },
                   ]

我正在尝试编写一个使用任何键“ client”或“ keys”并从上述列表中提取相应的“ server_name”和“ db_name”的函数。

def get_data()
"""
Look up the server_name and db_name based on the given 'key' or 'client' and return Tuple of strings (server_name, db_name)
"""


get_data(client_id='AAA')
get_data(session_key='k004')
get_data(session_key='')

感谢有人可以告诉我该怎么写 get_data()函数以一种简单的方式。谢谢!

3 个答案:

答案 0 :(得分:2)

const oops = m3.join(); // error!
/* The 'this' context of type 'Maybe<number>' is not assignable to method's
  'this' of type 'Maybe<Maybe<unknown>>'.  Type 'number' is not assignable 
  to type 'Maybe<unknown>'. */

答案 1 :(得分:2)

您将要遍历记录列表并检查它们的值。客户端搜索与按键搜索稍有不同。您还应该考虑返回多个值的搜索值。尝试这样的事情:

def get_data(client_id=None, session_key=None):
    # validate inputs
    if client_id is None and session_key is None:
        raise Exception("One search parameter must be supplied")

    if client_id is not None and session_key is not None:
        raise Exception("Only one search parameter can be supplied")

    # container to store all matches
    results = []

    # the client_id case
    if client_id is not None:
        for data_record in data_records:
            if client_id == data_record['client']:
                results.append(
                    (data_record['server_name'], data_record['db_name'])
                )

    # the session_key case
    if session_key is not None:
        for data_record in data_records:
            if session_key in data_record['keys']:
                results.append(
                    (data_record['server_name'], data_record['db_name'])
                )

    return results

如果您想将两个搜索结合起来,那么您还可以执行以下操作:

def get_data(client_id=None, session_key=None):
    # validate inputs
    if client_id is None and session_key is None:
        raise Exception("At least one search parameter must be supplied")

    # container to store all matches
    results = []

    # If a filter is active and doesn't match, 
    # skip the record and don't add the value
    for data_record in data_records:
        if client_id is not None: 
            if client_id != data_record['client']:
                continue

        if session_key is not None: 
            if session_key not in data_record['keys']:
                continue

        results.append(
            (data_record['server_name'], data_record['db_name'])
        )

    return results

只是为了好玩,在列表理解中做到这一切:

def get_data(client_id=None, session_key=None):
    # validate inputs
    if client_id is None and session_key is None:
        raise Exception("At least one search parameter must be supplied")

    return [
        (record['server_name'], record['db_name'])
        for record in data_records
        if (client_id is None or client_id == record['client'])
        and (session_key is None or session_key in record['keys'])
    ]

如果您想让搜索参数为空并仅返回第一个值,那么您也可以这样做:

def get_data(client_id=None, session_key=None):
    results = (
        (record['server_name'], record['db_name'])
        for record in data_records
        if (client_id is None or client_id == record['client'])
        and (session_key is None or session_key in record['keys'])
    )
    return next(results, None)

答案 2 :(得分:1)

java -Djava.security.krb5.conf=/etc/krb5.conf  -Djava.security.auth.login.config=/etc/SQLJDBCDriver.conf myApplication.jar

输出

> Create table Teams (   
>   Id integer
>   ,Name varchar(20) );
> 
> Create table Games (
>   HomeTeamId integer
>   ,VisitingTeamId integer  
>   ,HomeTeamWon boolean );
> 
> Insert Into Teams(Id, Name) Values (1, 'Real Madrid'); 
> Insert Into Teams(Id, Name) Values (2, 'Manchester City');
> Insert Into Teams(Id, Name) Values (3, 'Juventus');
> 
> Insert Into Games(HomeTeamId, VisitingTeamId, HomeTeamWon) Values (1,
> 2, True);
> 
> Select
>   HT.Name HomeTeam
>   ,VT.Name VisitingTeam
>   ,Case when HomeTeamWon Then HT.Name Else Vt.Name End WinningTeam 
> From   
>   Games G inner join
>   Teams HT on (G.HomeTeamId = HT.Id) inner join
>   Teams VT on (G.VisitingTeamId = VT.Id)