Python固定字符串大小

3
假设我需要一个由n个元素组成的数组,每个元素之间用空格分隔。进一步地,我需要第i个元素为1,其余元素为0。有什么最简单的Python方法?
因此,如果n = 10i = 2,我想要的结果是0 1 0 0 0 0 0 0 0 0
我想要像C++中可以使用的new string[]那样的东西,但我无法找到Python版本。
谢谢!

最后一个字符应该是空格还是0/1? - prelic
5个回答

6
使用列表。
n = 10
i = 2

mylist = ["0"] * n
mylist[i-1] = "1"
print " ".join(mylist)

在我看来,使用函数式编程的方式创建包含正确元素的列表比使用命令式编程的方式初始化并修改列表更符合 Pythonic 风格。然而,在这种情况下,命令式版本确实具有非常清晰的优点。 - cvoinescu
是的,那是我的目标。通常我喜欢一行式列表理解。 - kindall

2
以下Python生成器表达式应该能够产生您想要的结果:
" ".join("1" if i == (x+1) else "0" for x in range(n))

" ".join("1" if x==1 else "0" for x in range(n)):将从0到n-1的数字遍历,如果数字为1,则返回字符串"1",否则返回字符串"0",最后用空格连接所有字符串。 - Morwenn
@Morwenn,这对于i=2的情况有效。我认为i应该是一个变量。 - John La Rooy

1
以下来自 Python REPL 的示例应该能帮到您。Python 生成器表达式 " ".join(bin((1<<n)+(1<<n>>i))[3:]) 应该是一个解决方案。
>>> n=10
>>> i=2
>>> " ".join(bin((1<<n)+(1<<n>>i))[3:])
'0 1 0 0 0 0 0 0 0 0'

0

这看起来像是一道作业题,所以我会用英语描述我的答案而不是 Python。

使用列表推导式创建一个由 n 个字符串组成的列表,从中选择每个元素要么是 '1'(如果该项的索引是 i),要么是 '0'(否则)。使用空格将列表的元素连接起来。

有几种方法可以根据布尔值从两个项目中进行选择。其中之一是将两个项目放在序列中,并使用布尔值索引序列,因此如果为 False,则选择第一个元素,如果为 True,则选择第二个元素。在这种特殊情况下,您还可以通过多种方式将布尔值转换为 '0''1'(例如,将其转换为整数,然后转换为字符串)。

我不理解 new string[] 的注释——那不是 C++ 语法。

编辑

以下是 Python 代码:

' '.join([('0', '1')[x == i - 1] for x in range(n)])

或者

' '.join([str(int(x == i - 1)) for x in range(n)])

我更喜欢前者——它非常清晰地生成了0和1,而且可以轻松地将它们改变成其他东西。这里用的是i - 1而不是i来调整i从1开始而x从0开始的情况。通常情况下,我更喜欢在整个过程中使用基于0的索引,除非输入和输出格式要求基于1的值。在这种情况下,我会尽早转换输入,并尽可能晚地转换输出,绝对避免在同一段代码中混合两者。

你可以安全地删除方括号,将列表推导式转换为生成器推导式。在大多数情况下,它们的工作方式相同。


不用担心,这不是作业。我需要将我的蛋白质突变文件以特定格式呈现,以便能够在R中运行它们。其中1代表某个细胞系中某个氨基酸的突变,而0则表示没有突变。 - user1357015

0

只需使用“+”连接字符串:

("0 "*i + "1 " + "0 "*(n-i-1))[:-1]

或者您也可以使用bytearray:

a = bytearray(("0 "*n)[:-1])
a[i*2] = "1"
print str(a)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接