【问题标题】:Converting comma-separated string to list [duplicate]将逗号分隔的字符串转换为列表[重复]
【发布时间】:2014-08-24 18:02:28
【问题描述】:

我想将整数列表作为字段存储在我的模型中。由于在 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]。我怎样才能达到我想要的输出?

【问题讨论】:

  • 不知道为什么会发生这种情况,但如果我猜的话,你正在做的是 .split() 而不是 .split(',') 。或者,ast.literal_eval('0, 0, 0, 0') 会给你想要的结果。

标签: python django


【解决方案1】:

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 是什么意思?
  • 这听起来有些多余,但if x 会检查 x 是否为True。本例中的 x 是一个字符串,Python 中的字符串在为空时为 False,否则为 True
  • @RJT - 这并不完全正确。 if x 正在寻找真值。基本上,它是bool(x) == True - 在这种情况下,非空字符串的真值是True - 所以它是完全有效的。这是必需的,因为字符串以 , 结尾,而您不能使用 int(None)
  • 这就是我的意思,但我把它简化了太多。感谢您提供更清晰的答案。
【解决方案2】:
values = map(int, '0,1,2,3,'.rstrip(',').split(','))

【讨论】:

    猜你喜欢
    • 2013-02-04
    • 1970-01-01
    • 2021-01-23
    • 2011-11-11
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多