Python 三元条件用于连接字符串

0 投票
2 回答
3439 浏览
提问于 2025-04-18 06:05

由Martijn Pieters回答。谢谢。
这是因为“语句”和“表达式”的区别。
而且因为.join()这个方法不会改变原来的数据(它是一个纯函数),所以需要把它的结果赋值给一个变量。

问题:
为什么会出现这个奇怪的情况?

目标:

if base == 'T':
    RNA_seq += 'U'
else:
    RNA_seq += base

下面这个方法是可以正常工作的:

# += in expression1 and .join() in expression2
RNA_seq += 'U' if base == 'T' else RNA_seq.join(base)
# Edit note: RNA_seq.join(base) works because it returns `base`
#       aka. RNA_seq += 'U' if base == 'T' else base

但是下面这个方法就不行:

# Using += on both expressions
RNA_seq += 'U' if base == 'T' else RNA_seq += base

或者

# Using .join() for both expressions
RNA_seq.join('U') if base == 'T' else RNA_seq.join(base)

在Python2和Python3中,结果是一样的。

2 个回答

0

这里有一个简单的一行代码,可以完成DNA转录成RNA的操作(把T变成U):

RNA = lambda x:''.join([{'A':'A','C':'C','G':'G','T':'U'}[B] for B in x])
print RNA("AGTCAGCAT") #example sequence results in AGUCAGCAU
8

像所有的赋值操作一样,+=也是一个语句。你不能把语句放在一个表达式里。右边的表达式(也就是+=后面的部分)会被计算,计算的结果会被用来进行增强赋值。

可以这样做:

RNA_seq += 'U' if base == 'T' else base

现在这个表达式的结果要么是'U',要么是base,这取决于base的值。

如果'U' if base == 'T' else RNA_seq.join(base)能正常工作,那就说明RNA_seq.join()返回了一个新值,而没有直接修改RNA_seq的内容。RNA_seq.join('U') if base == 'T' else RNA_seq.join(base)同样会返回一个新值,这样原来的RNA_seq的值就不会改变,而你也没有把新值再赋值回RNA_seq

撰写回答