【问题标题】:What is the for loop trying to achieve试图实现的 for 循环是什么
【发布时间】:2014-10-16 14:38:20
【问题描述】:

这可能很简单,但有人可以解释一下下面的目的是什么吗?

def clean_param_value(self, value):
    for s, r in (('<', '{'), ('>', '}'), (' ', '_')):
        value.replace(s, r)

从

调用
    params = dict(
        (item['ParameterName'],
         self.clean_param_value(item['ParameterValue']))
        for item in cursor.fetchall()
        )

在for 循环中,变量s 和r 分别分配给'&lt;' 和'{' 并且在值字段上执行replace?其次是for循环中的其他两组。

【问题讨论】:

  • 您已经准确描述了正在发生的事情,那么您觉得困惑的是什么?
  • 这里可能缺少value = 和return value,因为发布的代码不会替换任何内容。

标签: python string dictionary tuples


【解决方案1】:

第一个代码

for s, r in (('&lt;', '{'), ...) 会将&lt; 分配给s,将{ 分配给r,以及下一次迭代中的下一项(元组解包)。

在循环str.replace 内返回一个新字符串,该字符串将所有出现的s 替换为r。所以它的意思是用{替换&lt;,用}替换&gt;,用_替换。

但是,不。不是因为str.replace 返回了一个新字符串,并且不会就地替换字符串。

为了正确,它应该分配回返回值。并且该方法应该返回被替换的字符串。

def clean_param_value(self, value):
    for s, r in (('<', '{'), ('>', '}'), (' ', '_')):
        # s, r = '<', '{'  # 1st iteration
        # s, r = '>', '}'  # 2nd iteration
        # s, r = ' ', '_'  # 3rd iteration
        value = value.replace(s, r)
    return value

顺便说一句,这里有更有效的方法。

您可以使用str.translate。

在 Python 2.x 中,使用 string.maketrans:

>>> import string
>>> tbl = string.maketrans('<> ', '{}_')
>>> '<hello world>'.translate(tbl)
'{hello_world}'

在 python 3.x 中:

>>> tbl = str.maketrans('<> ', '{}_')
>>> '<hello world>'.translate(tbl)
'{hello_world}'

第二个代码

第二部分是dict和generator expression:

>>> rows = [
...     {'name': 'dog', 'value': 'bow wow', 'other_value': 'blah'},
...     {'name': 'cat', 'value': 'meow meow', 'other_value': 'other blah'},
... ]
>>> dict((item['name'], item['value']) for item in rows)
{'dog': 'bow wow', 'cat': 'meow meow'}

这是从获取的行中获取 name、value 值以创建新字典。

使用固定版本的clean_param_value,它会产生类似的结果:

>>> dict((item['name'], clean_param_value(item['value'])) for item in rows)
{'dog': 'bow_wow', 'cat': 'meow_meow'}

有字典理解:

>>> {item['name']: clean_param_value(item['value']) for item in rows}
{'dog': 'bow_wow', 'cat': 'meow_meow'}

【讨论】:

  • @MartijnPieters,感谢您指出。相应地进行了编辑。
  • 您确实想解决该功能(大概)实现的功能。就目前而言,发布的代码根本不会做任何事情。很高兴您展示了正确有效的方法,但您实际上还没有回答问题。
  • 您知道str 上有一个名为str.maketrans() 的静态方法吗?
  • @MartijnPieters,不,我不知道。再次感谢您。
【解决方案2】:

它遍历元组 ('&lt;', '{'), ('&gt;', '}'), (' ', '_') 的元组,并“解包”s 和 r 分别作为元组中的第一个和第二个元素。

然后它会进行替换,因此最终将 &lt; 替换为 { 等

【讨论】:

  • 感谢澄清,非常感谢
  • 为了清楚起见,OP 提供的代码没有任何用处。假设value 是一个字符串,value.replace(s, r) 返回一个新字符串但value 本身并没有改变。
猜你喜欢
  • 2012-07-14
  • 2021-10-28
  • 1970-01-01
  • 2020-02-08
  • 2021-09-12
  • 1970-01-01
  • 2016-07-11
  • 2022-01-12
  • 1970-01-01
相关资源
最近更新 更多