【问题标题】:How do I apply the same function to each value in an array of dicts?如何将相同的函数应用于字典数组中的每个值?
【发布时间】:2020-05-17 16:24:31
【问题描述】:

我正在使用 Python 3.7。我有一个字典数组,每个数组都有相同的键。例如

arr_of_dicts = ({"st" : "il"}, {"st" : "IL"}, {"st" : "Il"})

如何将相同的函数应用于每个字典中的某个键的值?例如,我想将大写函数应用于上面的值

arr_of_dicts = ({"st" : "IL"}, {"st" : "IL"}, {"st" : "IL"})

?

【问题讨论】:

  • 使用for 循环和d['st'] = d['st'].upper() ?
  • 有什么事情可以一行完成吗?当我在 Python 控制台中尝试此操作时,“for d in arr_of_dicts: d['st'] = d['st'].upper()”什么也没回来,只是“...”
  • 你应该分两行来做。什么都不会卷土重来——那会改变原来的听写。如果您在此之后打印字典,您应该会看到更新后的字典。

标签: python arrays python-3.x dictionary


【解决方案1】:

使用map(),您可以使您的转换函数接受一个键来转换并返回一个lambda,它充当映射方法。通过使用之前传递的键 (k) 和传入的字典 (d),您可以返回一个新字典,并将字典的值转换为大写:

arr_of_dicts = ({"st" : "il"}, {"st" : "IL"}, {"st" : "Il"})

upper = lambda k: lambda d: {k: d[k].upper()} # your func
res = map(upper('st'), arr_of_dicts) # mapping method

print(list(res))

结果:

[{'st': 'IL'}, {'st': 'IL'}, {'st': 'IL'}]

如果您的字典有额外的键,那么您可以先将原始字典传播到新字典中,然后用大写版本覆盖您要转换的键属性,如下所示:

arr_of_dicts = [{"a": 5, "st" : "il"}, {"a": 7, "st" : "IL"}, {"a": 8, "st" : "Il"}]

upper = lambda k: lambda d: {**d, k: d[k].upper()}
res = map(upper('st'), arr_of_dicts) # mapping method

print(list(res))

结果:

[{'a': 5, 'st': 'IL'}, {'a': 7, 'st': 'IL'}, {'a': 8, 'st': 'IL'}]

【讨论】:

  • 我希望得到一个字典数组,比如输入。 “tuple(res)”是否具有相同的dicts类型数组?
  • 按数组是指列表吗?您可以将list(res) 用于列表(这会给您想要的结果吗?)
  • 是的好电话,我的意思是“列表”(对 Python 来说有点新)。这就是问题所在。如果 "arr_of_dicts" 变量包含 'arr_of_dicts = ({"a": 5, "st" : "il"}, {"a": 7, "st" : "IL"}, {"a": 8, "st" : "Il"})',运行上述删除所有键不是“st”的键值对。有没有办法保留所有字典的结构,并且只将与“st”键相关的值大写?
【解决方案2】:

您可能也喜欢熊猫。

如果你做了很多这样的事情,你应该检查pandas和它的apply functionality。它可以使这些事情变得像:

df = df.apply(your_func)

这是一个非常强大的工具,如果你喜欢的话,有时你可以制作一些漂亮且方便的单行线。

【讨论】:

    猜你喜欢
    • 2020-06-19
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 2023-01-10
    • 2016-05-25
    相关资源
    最近更新 更多