我正在阅读并解析一些数据。基本上,数据是一堆整数和字符串,所以我不能仅使用列表来存储数据。每组数据中都有一定数量的项目,但有时会遗漏一些项目。这就是我所拥有的。
users = [] # list of objects I'll be creating
# this all gets looped. snipped for brevity
data = "id", "gender", -1 # my main tuple that I will create my object with
words = line.split()
index = 0
data[0] = words[index]
index += 1
if words[index] == "m" or words[index] == "f":
data[1] = words[index]
index += 1
else:
data[1] = "missing"
if words[index].isdigit():
data[2] = words[index]
index += 1
users.append(User(data))
问题是您似乎无法直接分配给元组(例如data[1] = "missing"
),那么应该如何以pythonic方式分配?
答案 0 :(得分:4)
这是正确的,元组是不可变的。但是,您可以将任何不同的类型放入python列表中。
>>> a = []
>>> a.append("a")
>>> a.append(1)
>>> a.append(False)
>>> print a
['a', 1, False]
答案 1 :(得分:4)
Python元组是不可变的。来自documentation:
元组与字符串一样,是不可变的:不可能分配给元组的各个项目(尽管如此,你可以模拟大小相同的切片和连接效果)。也可以创建包含可变对象的元组,例如列表。
这是使他们与名单区别开来的主要因素。这很好地解决了一个可能的解决方案:使用列表代替元组:
data = ["id", "gender", -1]
答案 2 :(得分:0)
如果你必须使用元组(虽然正如其他人所说,列表应该可以正常工作),只需将数据存储到临时变量并从头开始创建元组,而不是在开头结束时使用临时值带有虚拟值。
答案 3 :(得分:0)
从您的代码中,看起来第一个字段“id”永远不会丢失。 假设您真的想要一个传递给User类的元组。
您可以先进行检查,然后将结果的总体分配给您的元组......
if words[1] in "mf":
data=tuple(words[i] for i in range(0,3))
else:
data=words[0],"missing",words[2]
但是请注意,后面的字段(如果存在)会正确分割,否则字段含义会混淆。