【问题标题】:Python: Replace substring with a listPython:用列表替换子字符串
【发布时间】:2016-07-01 20:16:44
【问题描述】:
needs_eval = "((abc or def) and ghi)"

dict_group = {abc: ['gh@ab.com', 'ab@ab.com', 'ij@ab.com'], def: ['ab@ab.com', 'cd@ab.com', 'ef@ab.com'], ghi: ['cd@ab.com', 'ab@ab.com', 'kl@ab.com', 'gh@ab.com']}

for k,v in dict_group.iteritems():
    str_v=str(v[0])
    needs_eval = needs_eval.replace("and", "&").replace("or", "|").replace(k,str_v)
#needs_eval = re.sub(k,v[0],needs_eval)
print(list(eval(needs_eval)))

O/p i get: ((['gh@ab.com', 'ab@ab.com', 'ij@ab.com'] | ['ab@ab.com', 'cd@ab.com', 'ef@ab.com']) & ['cd@ab.com', 'ab@ab.com', 'kl@ab.com', 'gh@ab.com'])

当我评估“needs_eval”时,我想要逻辑输出“['cd@ab.com', 'ab@ab.com', 'gh@ab.com']”

我将字典“value”转换为字符串,然后将其替换为“needs_eval”字符串,因为“replace or re.sub”只传递字符串。

【问题讨论】:

  • 您需要更清楚地说明这一点,我认为在没有指导的情况下让人们阅读您的代码并弄清楚您要做什么是不公平的。据我所知,该字典声明应该会引发错误,因为 abc、def 和 ghi 没有在任何地方声明。
  • 如何在预期输出中得到kl@ab.com
  • 感谢大家指出错误的代码。我已经删除了底部并更改了预期的 o/p。
  • 还有,你为什么使用eval?这似乎是xy problem 的重中之重。你到底想做什么?我有一个比eval更好的解决方案...

标签: python replace substring


【解决方案1】:

运算符|& 仅定义在set 而不是list,因此您需要将dict_group 更改为集合字典,例如:

needs_eval = "((abc or def) and ghi)"
dict_group = {'abc': {'gh@ab.com', 'ab@ab.com', 'ij@ab.com'},
              'def': {'ab@ab.com', 'cd@ab.com', 'ef@ab.com'}, 
              'ghi': {'cd@ab.com', 'ab@ab.com', 'kl@ab.com', 'gh@ab.com'}}

>>> for k,v in dict_group.items():
...     needs_eval = needs_eval.replace("and", "&").replace("or", "|").replace(k,str(v))
>>> list(eval(needs_eval))
['cd@ab.com', 'ab@ab.com', 'gh@ab.com']

如果您只需要满足条件的一组值,则不确定为什么需要转换为列表:

>>> eval(needs_eval)
{'ab@ab.com', 'cd@ab.com', 'gh@ab.com'}

【讨论】:

  • 完美,这行得通。由于这个字典(dict_group)是在运行时创建的,并且在其他地方也使用过,所以我不想把它改成一个集合。但下面是使其正常工作的代码更改:str_v=str(set(v[0]))
【解决方案2】:

我认为 'AND's 和 'OR's 在比较列表时不会像你做的那样做。

在玩弄了这个(之前从不知道这不是语法错误)并阅读了this 帖子之后,似乎:

AND 与两个计算结果为 True 的列表返回正确的操作数

OR 与两个计算结果为 True 的列表返回左操作数

因为您的列表包含项目,所以它们的评估结果始终为 True。您的输出只是因为您在列表中应用(和分组)“AND”和“OR”的顺序。

不可避免地会困扰您的棘手错误是 - 如果您尝试迭代字典以生成列表值,您将获得非确定性行为。这是因为字典保证顺序,所以有时你会因为“没有明显原因”而得到不同的输出。

我强烈建议不要在列表中依赖“and”和“or”运算符。

【讨论】:

  • OP 正在将 andor 更改为 &|,它们是在集合上定义的。并且确实给出了预期的答案...
  • 提问者在他们手动运行它的帖子末尾的 sn-p,它只是使用列表 -> 这就是导致我担心 b/c 它只是返回最正确的列表,这被定义为他们的预期行为。
  • 啊,是的。没有注意到 - 正如您指出的那样,它只返回最后一个列表。
猜你喜欢
  • 1970-01-01
  • 2021-12-19
  • 2017-06-22
  • 2014-10-12
  • 2019-06-26
  • 2016-12-24
  • 1970-01-01
  • 2019-01-30
  • 2019-02-26
相关资源
最近更新 更多