Python:用列表

时间:2016-03-16 05:25:46

标签: python replace substring

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']& #34;

我正在转换dict" value"在将其替换为" needs_eval"之前将其转换为字符串字符串因为"替换或重新发布"只传递字符串。

2 个答案:

答案 0 :(得分: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'}

答案 1 :(得分:0)

在比较列表时,我并不认为“和”和“或”正在做的事情。

在玩完这个之后(从来不知道这不是之前的语法错误)和阅读this帖子,看来:

与两个评估为True的列表返回右操作数

OR与两个评估为True的列表返回左操作数

由于您的列表中包含项目,因此它们始终会评估为True。您的输出只是因为您将“∧”和“&#”组织应用(和分组)到您的列表中的顺序而发生。

将不可避免地指责你的粗糙错误是 - 如果你试图迭代字典来生成列表值,你将得到非确定性行为。这是因为词典保证顺序,所以有时候你会得到不同的输出"没有明显的原因"。

我强烈建议不要依赖'和'和'或'您的清单的运营商。