2

我有一个 python 程序,它打印出一些由其他 python 程序创建的列表,格式如下: [0, [], 0, 1, [], 1]

我想将 0 和 1 更改为字母,即在上面的输入中,我想将其 [x, [], x, y, [], y]作为输出

到目前为止,我执行此操作的代码如下所示:

for x in search.Search(s, s.run()):
    if x == 0:
        return x
    elif x == 1
        return y

我知道我错过了一些东西,但我不太确定是什么:(

4

6 回答 6

4

使用列表推导:

subst = {0: 'x', 1: 'y'}
return [subst.get(v, v) if v else v for v in search.Search(s, s.run()]

通过使用return,您可以提前退出循环。

if v else v有助于避免尝试将空列表用作键(这会引发 TypeError;列表不可散列,因此不允许用作键)。替代策略是:

from collections import Hashable

subst = {0: 'x', 1: 'y'}
hashable = lambda v: isinstance(v, Hashable)
return [subst.get(v, v) if hashable(v) else v for v in search.Search(s, s.run()]

subst地图更容易扩展;但是使用函数来映射值(如Jacob's answer中所用)对您来说可能更具可读性。

于 2012-12-21T12:09:40.923 回答
3

返回中断执行,你可能想要这样的东西

def switch_letter(x):
    if x == 0:
        return 'x'
    if x == 1:
        return 'y'
    return x

my_letters = [switch_letter(x) for x in search.Search(s, s.run())] 
于 2012-12-21T12:10:15.750 回答
1

这个答案类似于Martjin的答案。也许你可以试试这个。但它适用于 python>2.4

>>> a=[0, [], 0, 1, [], 1]
>>> s={0:'x',1:'y'}
>>> [x if isinstance(x,list) else s.get(x,'') for x in a]
['x', [], 'x', 'y', [], 'y']
于 2012-12-21T14:11:57.957 回答
0
    python 3.2
     a= [0, [], 0, 1, [], 1]
     b={0:"x",1:"y"}
     result=[b[i] if isinstance(i,int) else [] for i in a]


  2. [i  if isinstance(i,list) else b[i] for i in a ]
于 2012-12-25T05:45:47.897 回答
0

我认为对于非 python 程序员来说,内置函数映射比列表压缩更简洁、更简单。

def sust(item):
    if item == 0:
        return "x"
    if item == 1:
        return "y"
    return item
output = map(sust, search.Search(s, s.run()))
于 2012-12-25T06:04:11.497 回答
-2

生成器允许在内部使用 if-else 语句。在这种情况下,您的代码将看起来接下来。

['y' if i else 'x' for i in search.Search(s, s.run()]
于 2012-12-21T12:18:13.153 回答