我正在清理数据。在下面的代码中,我使用str.title
函数将单词大写。然后,我检查它们是否为空,如果是,我写点东西。但是然后我必须将行分配回一个变量,但是对此我有些困惑。
for row in moma:
gender = row[5]
#capitalize gender column
gender = gender.title()
#check to see if column is empty
if not gender:
gender = 'Gender Unknown/Other'
row[5] = gender
for row in moma:
Nationality = row[2]
Nationality = Nationality.title()
if not Nationality:
Nationality = 'Nationality Unknown'
row[2] = Nationality
示例数据:
['Duplicate of plate from folio 11 verso (supplementary suite, plate 4) from ARDICIA', 'Pablo Palazuelo', 'Spanish', '(1916)', '(2007)', 'Male', '1978', 'Prints & Illustrated Books']
['Tailpiece (page 55) from SAGESSE', 'Maurice Denis', 'French', '(1870)', '(1943)', 'Male', '1889-1911', 'Prints & Illustrated Books']
答案 0 :(得分:1)
由于生成的值是一个单独的对象,因此必须重新分配到该行。您必须使用对象更新该行才能影响该行。
您提供的代码看起来可以正常工作,但是可以简化。无需对行进行两次迭代,例如:
moma = [['w','x','male','y','z',''],
['w','x','','y','z','French']]
for row in moma:
row[2] = row[2].title() if row[2] else 'Gender Unknown/Other'
row[5] = row[5].title() if row[5] else 'Nationality Unknown'
print(row)
输出:
['w', 'x', 'Male', 'y', 'z', 'Nationality Unknown']
['w', 'x', 'Gender Unknown/Other', 'y', 'z', 'French']
答案 1 :(得分:0)
python具有可变对象(如列表或字典)和不可变对象(如string或int)。 可变对象总是按引用分配。这意味着对副本的更改会影响原始值。另一方面,不可变对象在分配给另一个变量后会被深深复制,因此机会仅会影响复制的版本。
编辑:我错了。 Python从不复制作业。
Python中的Assignment语句不复制对象,它们在目标和对象之间创建绑定。 https://docs.python.org/3/library/copy.html
答案 2 :(得分:0)
您的问题分为两部分:
im cleaning data. In the code below, I am using the str.title function to capitalize words. Then I check to see if they are empty, and if so I write something. But then I have to assign the row back to a variable, but I am a bit confused on that.
为什么我必须重新分配给变量
在您的代码中,编写以下内容:
gender = gender.title()
还有以下内容:
if not gender:
gender = 'Gender Unknown/Other'
模式a = do something with a
背后的原因是Python中的字符串是不可变的,这意味着您无法修改它们。当您执行gender = f(gender)
时,您会将f(gender)
的结果分配给名称“性别”,从而删除了以前存在的所有定义。
顺便说一句,在Python中,您可以为名称分配值。文档中几乎没有提到“变量”的概念。都是关于名字的。
因此,在代码的后面,您编写了row[5] = gender
。之所以需要这样做,还因为字符串是不可变的:您无法在不为其分配其他任何内容的情况下更改该行。
现在,如果该行是其他内容(例如对象),则可以执行类似row[5].content = 'blah'
的操作。