Python 3.6.9-列表-for循环中的就地修改

时间:2020-05-14 18:48:17

标签: python python-3.x

背景

我在Python列表中存储了一个名称和电子邮件地址列表。

user_data_list = [['Adam', 'adam@abc.com'],
                  ['Alice', 'alice@stu.edu'],
                  ['Eve', 'eve@abc.com'],
                  ['Bob', 'bob@abc.com']]

我有两个列表,分别包含旧的和更新的电子邮件地址old_domain_email_listnew_domain_email_list。列表的内容是:

old_domain_email_list = ['adam@abc.com', 'eve@abc.com', 'bob@abc.com']
new_domain_email_list = ['adam@xyz.com', 'eve@xyz.com', 'bob@xyz.com']

我打算将电子邮件地址更新为现在包含xyz.com而不是abc.com。下面的代码行遍历user_data_list并更新列表中匹配的条目。


for user in user_data_list:
    for old_domain_email, new_domain_email in zip(old_domain_email_list, new_domain_email_list):
        if user[1] == old_domain_email:
            user[1] = new_domain_email

然后将更改后的nameemail address对写入CSV文件。

with open(report_file_location, 'w+') as output_file:
        writer = csv.writer(output_file)
        writer.writerows(user_data_list)
        output_file.close()

查询

由行user_data_list更新的user[1] = ' ' + new_domain_email中的用户详细信息是否发生在原地?该代码不会明确地尝试修改user_data_list,但是writer.writerows(user_data_list)方法仍然可以正确地创建具有更新域名的新文件。

使用的Python版本:3.6.9

我希望我能弄清楚这个问题。

2 个答案:

答案 0 :(得分:1)

是的,修改正在进行中。 user[i] = ...调用user的{​​{1}}方法,该方法不会更改__setitem__引用指向的对象。

答案 1 :(得分:0)

是的。您可以使用列表理解功能简化电子邮件地址的替换。

[[i[0], i[1].split('@')[0]+'@xyz.com'] for i in user_data_list]

结果:

[['Adam', 'adam@xyz.com'], ['Alice', 'alice@xyz.com'], ['Eve', 'eve@xyz.com'], ['Bob', 'bob@xyz.com']]
相关问题