【问题标题】:Python: How can I use an enumerate element as a string?Python:如何将枚举元素用作字符串?
【发布时间】:2020-04-02 17:10:14
【问题描述】:

我有一个正在枚举的 dict1.keys() 列表,我想将该元素用作字符串。

for i,j in enumerate(dict1.keys()): str(j) = somethingElse
>>> SyntaxError: can't assign to function call

https://dbader.org/blog/python-enumerate 将枚举实体描述为一个元组:(索引,元素)。 type(j)<class 'str'>,我可以打印,但不能用作变量。

编辑:

for i,j in enumerate(dict1.keys()): j = somethingElse

编辑2: 我认为问题可能出在熊猫身上。第一行有效,第二行无效。

for i,j in enumerate(dict1.keys()): list1.append(j)
for i,k in enumerate(list1): k = pd.DataFrame(dict1[k]['Values'])

编辑3: 第二行确实有效,但仅以一个 df 结尾,名称为“k”而不是键。但这是我想要的。每个 dict 都使用其键名转换为 df:

for i,j in enumerate(dict1.keys()): j = pd.DataFrame(dict1[j]['Values'])

编辑4: 根据下面的 cmets,我切换到键上的 for 循环(不需要显式调用),但它仍然不会使用元素 'i' 作为变量。但是,从下面链接的问题中,元素可以用作字典中的键。在将问题减少为“使用列表项作为数据框的名称”并对其进行搜索后,它会出现问题。我也会发布作为答案:

dict2={}
for i in dict1: dict2[i] = pd.DataFrame(dict1[i]['Values'])

..因此名称被保留。实际上,这类似于 Sheri 对列表的回答,但名称保留与 dfs 的关联。可能没有办法使用纯字符串以外的东西来设置变量值,但我会为此开始一个不同的question

use elements in a list for dataframe names

【问题讨论】:

  • 你在这行中要做什么str(j) = somethingElse
  • 你能和我们分享你的字典吗
  • @sheri,我正在尝试从字典创建 pandas 数据帧,这些字典是大约 4 个键的更高字典的值。它令人困惑,所以我试图笼统地提出这个问题
  • 因为您是在 for 循环内动态生成 pandas 数据帧,所以最后当您打印 k 时,它会显示最后生成的数据帧。您应该将数据框存储在列表中
  • 试试这个for i,j in enumerate(dict.keys()): j = pd.DataFrame(dict[j]['Values']); listOfFrame.append(j)

标签: python syntax-error


【解决方案1】:

因为您是在 for 循环中动态生成 pandas 数据帧,所以最后当您打印 j 时,它会显示最后生成的数据帧。您应该将数据框存储在列表中尝试使用:

listOfFrame = [] 
for j in dict.keys(): 
    j = pd.DataFrame(dict[j]['Values'])
    listOfFrame.append(j)

【讨论】:

  • 我认为它可能必须是一个两步过程.. 但更重要的是,我可以使用 elementInStrForm 作为熊猫数据框的名称.. 我正在测试..
  • @alchemy 你可以轻松做到这一点
  • 谢谢,请参阅我的 EDIT2。可能是 pandas 或我使用它的语法有问题。
  • 实际上,也请参见 Thomas 的回答。在分配变量值时,它似乎使用了“j”作为字母,而不是枚举元素“j”。我将尝试您在上面粘贴的代码。你可以在这里回复,我看到了。
  • @KonradRudolph,好的,然后使用列表理解提供和回答。您还可以解释为什么它比 enumerate 和 keys 更好,显然是从 enumerate 不能将元素用作常规变量的事实开始。在任何其他变量命名为 i 或 j 的情况下,这实际上是有意义的,其中 enumerate 必须决定是否覆盖它们。我认为这就是我使用它不起作用的原因。否则,它似乎是最简洁易读的表述。等一下。 .也许你做到了..
【解决方案2】:

确实j 将是str(或您在dict 中使用的任何其他类型的密钥)。

实际问题出在循环体上,如错误消息所述:

str(j) = somethingElse

不是有效的 Python。左侧是对str 函数的调用,因此您无法为其赋值。

【讨论】:

  • 你确实是对的。但现在它只是将 somethingElse 分配给 'j' 而不是 dict 键..
  • 是的,我只用了dir(),没有键,只设置了'j'
【解决方案3】:

根据您既不想enumerate 也不想遍历字典键的 cmets。相反,您想迭代它的

dfs = []
for val in dict1.values():
    dfs.append(pd.DataFrame(val['Values']))

但是,这通常不会在 Python 中使用显式循环来编写,例如使用 list comprehension

dfs = [pd.DataFrame(val['Values']) for val in dict1.values()]

【讨论】:

  • 是的,我想这会奏效。 ..是的,这就是for i in range(len(list1)):..的脾气暴躁的问题,让人不得不使用Enumerate,然后又忘记了in的本意。他们确实应该对列表做出与 dicts 相同的默认行为。 for i in list1: list1[i],不需要枚举.. 除非在特定情况下.. = 更高级别的语言.. 和更少的混乱。谢谢..它仍然可能有可变的碰撞。这是否适用于 val = pd.DataFrame(val['Values']) 作为没有列表的第三行?这就是 Enumerate 遇到问题的地方。
  • for 循环的工作方式与 Enumerate 相同,但更简洁。它仍然不允许使用元素 i 作为变量。我正在尝试使用名称而不是未命名的 dfs 列表创建几个 dfs,因为名称会发生​​变化,因此它们在 dict1.keys() 中的顺序会发生变化,然后是 list1 中 dfs 的顺序。最好分别命名它们,这样我就可以用它的名字来调用 df。为了在循环中有效地做到这一点,我需要能够使用元素 i 作为变量。或者我可能不得不用键重命名它们,效率低下。
  • @alchemy “它仍然不允许使用元素 i 作为变量。” ——这是语言的一个基本限制。您不能(直接)使用“变量”变量。语言如何在语法上消除 regular 变量的歧义?解决这个问题的方法就是使用 dicts,您可以在其中使用名称作为键。
  • 谢谢,正如我在我的新问题(顶部)中所说,Bash 能够做到这一点。它只是覆盖了 regular 变量。字典效率较低,请参阅对问题的少数答案被标记为重复。其他人使用对象和类,效率也较低。但是使用 var() 或 global() 函数很简洁,并且使用 setattr(sys.modules[__name__], var_name, var_value) 可能适用于 for 循环中的元素。 ..必须测试一下。
  • @alchemy Bash 只允许这样做,因为在 Bash 中使用的变量以 $ 为前缀,而变量赋值和声明则不是。这就是 Bash 如何在语法上区分这些情况。您当然可以使用var 等,但这些也可以在内部使用字典
【解决方案4】:

从下面链接的问题中,元素可以用作字典中的键。在将问题减少为“使用列表项作为数据框的名称”并对其进行搜索后,它会出现问题。我也将作为答案发布:

dict2={}
for i in dict1: dict2[i] = pd.DataFrame(dict1[i]['Values'])

..因此名称被保留。实际上,这类似于 Sheri 对列表的回答,但名称保留与 dfs 的关联。可能没有办法使用纯字符串以外的东西来设置变量值,但我会为此开始一个不同的question

use elements in a list for dataframe names

【讨论】:

    猜你喜欢
    • 2015-12-19
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多