【问题标题】:(Python) Extract value in a dict in list(Python)在列表中的字典中提取值
【发布时间】:2020-07-21 08:32:44
【问题描述】:

您好, 我使用 Discord 机器人为游戏 (iRacing) 进行了一个新项目,以在比赛期间保存信息。我使用 pyirsdk 并查看所有源代码以尝试了解它是如何工作的。 但是,我在列表中有一个字典,我被阻止了。


DriverInfo: 

{

    'DriverHeadPosX': -0.579,
    'DriverHeadPosY': 0.398,
    'DriverHeadPosZ': 0.571,

    'Drivers': 

    [

    {'CarIdx': 0, 'UserName': 'Enzo Foucaud', 'AbbrevName': '', 'Initials': '', 'UserID': 409133, 'TeamID': 0, 'TeamName': 'Enzo Foucaud', 'CarNumber': '64', 'CarNumberRaw': 64, 'CarPath': 'mercedesamggt3', 'CarClassID': 0, 'CarID': 72, 'CarIsPaceCar': 0, 'CarIsAI': 0, 'CarScreenName': 'Mercedes AMG GT3', 'CarScreenNameShort': 'Mercedes AMG GT3', 'CarClassShortName': None, 'CarClassRelSpeed': 0, 'CarClassLicenseLevel': 0, 'CarClassMaxFuelPct': '1.000 %', 'CarClassWeightPenalty': '0.000 kg', 'CarClassPowerAdjust': '0.000 %', 'CarClassColor': 16777215, 'IRating': 1, 'LicLevel': 1, 'LicSubLevel': 1, 'LicString': 'R 0.01', 'LicColor': '0xundefined', 'IsSpectator': 0, 'CarDesignStr': '1,dff000,1a4b9b,ffffff', 'HelmetDesignStr': '1,dff000,1a4b9b,ffffff', 'SuitDesignStr': '1,dff000,1a4b9b,ffffff', 'CarNumberDesignStr': '0,0,FFFFFF,777777,000000', 'CarSponsor_1': 0, 'CarSponsor_2': 0, 'CurDriverIncidentCount': 0, 'TeamIncidentCount': 0}

    ]

}

我这样做是为了知道“用户名”是否存在

DriversInfo_list = ir['DriverInfo']
print('DriverInfo:', DriversInfo_list)
    for i in DriversInfo_list:
        if i == 'Drivers':
            print("Drivers Exists")
            SoloDriver = DriversInfo_list['Drivers']
            print(SoloDriver)
            if [d['UserName'] for d in SoloDriver if 'UserName' in d]:
                print('Username Exists')

控制台:

DriverInfo: {...}
Drivers Exists
[{'CarIdx': 0, ...}]
Username Exists

现在,我想在作为列表的 DriverInfo 中提取许多“驱动程序”(dict)的信息。 例如,我想要 UserName 的值,但我不知道该怎么做。我整天都在搜索.. ^^我做了很多课来尝试这个^^

感谢您的回答

【问题讨论】:

  • 你的预期输出是什么?
  • 我想要 Enzo Foucaud 为 UserName 或 Mercedes AMG GT3 为 CarScreenName Edit : 或 Drivers 中的其他值

标签: python list dictionary extract


【解决方案1】:

这取决于是否所有 DriversInfo 项仅包含驱动程序键中一个字典的列表。但你可以这样做:

DriversInfo_list = ir['DriverInfo']
for soloDriverInfo in DriversInfo_list['Drivers']:
    #Iterate in list of driver key
    print(f"username: {soloDriverInfo['UserName']}, car: {soloDriverInfo['CarScreenName']}") 

【讨论】:

  • 是的,DriversInfo 中只有一个字典(往上看),你的代码有问题,不知道为什么?语法错误:扫描字符串文字时 EOL
  • 我忘记了一个" = print(f"用户名:{soloDriverInfo['UserName']},汽车:{soloDriverInfo['CarScreenName']}")
【解决方案2】:

假设Drivers 列表中的每个驱动程序字典具有完全相同的键。否则会抛出 KeyError。为避免此错误,请检查 lambda 中是否存在该键。

drivers = ir['DriverInfo']['Drivers']
result = list(map((lambda x: x['UserName']), drivers))

【讨论】:

  • 谢谢!这就是我想要的!我可以添加多个 lambda 吗?
  • 我不确定你所说的多个 lambda 是什么意思。 map 函数映射drivers 列表中的每个元素并调用 lambda 函数。 lambda 函数返回驱动程序的UserName
猜你喜欢
  • 2022-07-12
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-06
  • 1970-01-01
  • 2016-09-24
  • 1970-01-01
相关资源
最近更新 更多