python元组是可修改的吗?
我正在读取和解析一些数据。基本上,数据是一堆整数和字符串,所以我不能只用一个列表来存储数据。每组数据中都有一定数量的项,但有时会丢失一些项。这是我的python元组是可修改的吗?,python,Python,我正在读取和解析一些数据。基本上,数据是一堆整数和字符串,所以我不能只用一个列表来存储数据。每组数据中都有一定数量的项,但有时会丢失一些项。这是我的 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 =
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))
问题是您似乎无法直接分配给元组(例如
数据[1]=“missing”
),那么应该如何以pythonic方式分配它呢?没错,元组是不可变的。但是,您可以将任何不同的类型放入python列表中
>>> a = []
>>> a.append("a")
>>> a.append(1)
>>> a.append(False)
>>> print a
['a', 1, False]
Python元组是不可变的。从: 元组和字符串一样是不可变的:不可能将其分配给元组的各个项(不过,您可以通过切片和串联模拟大致相同的效果)。还可以创建包含可变对象(如列表)的元组 这是将它们与列表区分开来的主要原因。这很好地引出了一个可能的解决方案:使用列表代替元组:
data = ["id", "gender", -1]
如果您必须使用元组(尽管其他人已经说过,列表应该可以正常工作),只需将数据存储到临时变量中,并在循环结束时使用临时变量从头创建元组,而不是在循环开始时使用伪值。从您的代码看,第一个字段“id”似乎永远不会丢失。 假设您确实需要一个元组来传递给您的用户类 您可以先进行检查,然后将结果的总和分配给元组
if words[1] in "mf":
data=tuple(words[i] for i in range(0,3))
else:
data=words[0],"missing",words[2]
但是,您应该注意正确拆分后面的字段(如果存在),否则字段的含义会混淆。“基本上,数据是一组整数和字符串,因此我不能仅使用列表来存储数据。”是否要解包?元组是不可变的,但如果需要将内容存储为元组,您始终可以先将其创建为列表,然后调用
tuple(list)
。类实例的可能副本基本上都是美化的tuple;)请注意,如果单词[index]='m'或单词[index]='f':
也不是pythonic。如果('m','f')中的单词[index]出现,请尝试:
。您似乎也在大量增加索引。你可以少做一点,或者更好,使用for循环。幽默的但毫无帮助。问题的关键是最后一句话:“问题是你似乎不能直接分配给元组(比如data[1]=“missing”
),那么应该如何以pythonic的方式分配呢?”当我投了反对票时,你的回答只是“那是正确的,元组是不可变的。”不幸的是,看起来您正在同时编辑您的问题。我会根据您的编辑删除我的否决票,但我的投票被锁定。很抱歉如果您再次编辑您的问题,请在评论中ping我,我将删除我的downpoite.Yikes。我不知道你可以把不同的类型放到一个列表中。很抱歉这个简单的问题,谢谢!不需要道歉。只有学会了,事情才会变得容易!“无法修改其项目”为false。元组可以包含可变对象,例如,tup=([]);tup[0]。追加(1)
您不能分配给单个项目,例如,tup[0]=“XXX不起作用”
。文档中的片段明确提到了这两点。@J.F.Sebastian嗯,我不是那个意思。我现在已经删除了我的解释,让医生们自己说话。