【问题标题】:struggling to avoid repeated values from the list comprehension努力避免列表理解中的重复值
【发布时间】:2019-08-11 07:36:52
【问题描述】:

我有一个这样的列表:

['A' '0' '0' '0' 'A']

我有一个这样的 dict1:

{1.12: 0, 1.21: 'A', 1.22: 'B', 1.41: 0, 1.31: 'A', 1.32: 'B', 2.11: 0}

我期待使用以下方法根据 list1 中的 dict1 值获取 dict1 键

np.array([dict1[x] for x in list1])

输出:

[1.31 3.41 3.41 3.41 1.31]

但是我想输出:

[1.21  1.12  1.41  2.11 1.31]   

由于列表理解,我如何在不重复字典键的情况下获得此输出

【问题讨论】:

    标签: python list list-comprehension


    【解决方案1】:

    根据您的列表理解:

    [dict1[x] for x in list1]
    

    您要做的是遍历列表并收集与列表中的项目关联的所有值作为字典中的键。您的代码有以下问题:

    一个。如果在字典中找不到键怎么办,会导致异常。
    湾。您需要检查 dict 中是否存在与列表中的数据相同的值。

    解决方案类似于:

    np.array([key for key, value in dict1.items() if value in list1])
    

    这样,您遍历 dict 并同时检查 list 中的值是否存在,并且仅当它存在时才接受它,否则忽略相同的值。

    一种更有效的查找方法是将list1 转换为set,因此您的in 子句可以在O(1) 时间而不是O(N) 时间内返回结果以获得更好的性能。应该是这样的:

    myset = set(list1) ##assuming this you could create beforehand if possible instead of list
    np.array([key for key, value in dict1.items() if value in myset])
    

    【讨论】:

    • 此外,列表中的值是字符串类型,而字典中的键是整数类型。因此...np.array([key for key, value in dict1.items() if str(value) in myset])
    【解决方案2】:

    我认为您的数据结构使这个问题变得更加困难。如果你改变它,问题就会变得更容易解决。

    首先,当 dicts 打算以相反的方式使用时,您会尝试按值查找键。

    其次,您试图通过一个值查找多个项目。这可以通过从值列表中弹出项目来完成。

    因此,如果您像这样重组数据:

    data = {'A': [1.31, 1.21], 'B': [1.32, 1.22,], '0': [2.11, 1.41, 1.12]}
    

    您可以查找适当的列表并像这样弹出值:

    results = [dict2[value].pop() for value in list1]
    

    注意:在旁注中,您的列表缺少问题中的逗号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-22
      • 1970-01-01
      • 1970-01-01
      • 2017-01-18
      • 2015-06-13
      相关资源
      最近更新 更多