将逗号分隔的字符串转换为列表。

7
我想在我的模型中将整数列表存储为字段。由于Django默认情况下没有提供此字段,因此我正在使用称为x的CommaSeparatedIntegerField来实现。在我的视图中,我将该字符串转换为整数列表。当使用参数n创建模型实例时,我希望x被设置为长度n,每个元素都设置为零。
以下是模型:
class Foo(models.Model):
    id = models.IntegerField(default = 0)
    x = models.CommaSeparatedIntegerField(max_length = 10)

@classmethod
def create(cls, _id, n):
    user = cls(id = _id)
    user.class_num_shown = '0,' * n

然后我创建一个实例:

f = Foo.create(1, 4)
f.save()

从数据库中加载并将字符串转换为列表:
f = Foo.objects.get(id = 1)
x_string = f.x
x_list = x_string.split(',')
print x_list

但是这会输出 [u'0,0,0,0,'] 而不是我想要的 [0,0,0,0],我该如何得到我想要的输出结果?

2
不确定为什么会发生这种情况,但如果我猜的话,你可能是在使用.split()而不是.split(',')。或者,ast.literal_eval('0, 0, 0, 0')可以给你想要的结果。 - karthikr
2个回答

5
split()的分隔符参数不是要分割的不同字符列表,而是整个分隔符。你的代码只会分割“逗号空格”的出现。
此外,如果你想要整数而不是子字符串,你需要进行转换。
最后,因为你有一个尾随逗号,你需要过滤掉分割后的空结果。
>>> data = '0,0,0,0,'
>>> values = [int(x) for x in data.split(',') if x]
>>> values
[0, 0, 0, 0]

谢谢,这个可以用。但是请问一下 [int(x) for x in data.split(',') if x] 的语法是什么意思?if x 是什么意思? - Karnivaurus
1
它们被称为list_comprehensions - karthikr
这可能听起来有些冗余,但是 if x 将检查 x 是否为 True。在这种情况下,x 是一个字符串,在 Python 中,当字符串为空时为 False,否则为 True - RJT
@RJT - 这并不完全正确。if x 是在寻找真值。基本上,它执行 bool(x) == True - 在这种情况下,非空字符串的真值为 True - 因此它是完全有效的。这是必需的,因为该字符串以 , 结尾,您无法执行 int(None) - karthikr
这就是我的意思,但我简化得太多了。感谢您提供更清晰的答案。 - RJT
@karthikr:在这种情况下,您不能执行int('') - FogleBird

4
values = map(int, '0,1,2,3,'.rstrip(',').split(','))

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