下面的代码打开一个csv并将其放入一个列表为列表的词典中。有重复的键,无法更改。关键是帐号列,即行[1]。现在,如果' CITY'在行[8]中找到字符串,该键和值将被删除。如何编写此代码以便同一密钥的所有其他实例(以及相应的值)也将被删除?
with open('c:\\file.csv', 'rb') as f:
reader = csv.reader(f)
result = collections.defaultdict(list)
for row in reader:
key = row[1]
result[key].append([row[0], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9], row[10], row[11], row[12]])
if 'CITY' in row[8]:
result.pop(key)
这是一个输入示例:
3929, 56794, 5555551212, August, IL, 62305, Steve, Johnson, City, Max, Folder, 22, 56
3929, 56794, 5555551212, August, IL, 62305, Steve, Johnson, None, Max, Folder, 22, 85
3929, 58586, 5555551212, August, IL, 62305, Steve, Johnson, None, Max, Folder, 22, 69
这是我想要的输出:
3929, 58586, 5555551212, August, IL, 62305, Steve, Johnson, None, Max, Folder, 22, 69
因此," City"如果在第一行中找到,则将删除具有56794帐号的两行。
答案 0 :(得分:1)
如果我理解正确,你想要一个键,如果它的任何一行在第8位包含“CITY”,那么我认为你可能最好分别跟踪这些“不需要的”键,像这样的东西:
with open('c:\\file.csv', 'rb') as f:
reader = csv.reader(f)
result = collections.defaultdict(list)
unwantedKeys = set()
for row in reader:
key = row[1]
if 'CITY' in row[8]:
unwantedKeys.add(key)
if key in result:
result.pop(key)
if key not in unwantedKeys:
result[key].append([row[0], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9], row[10], row[11], row[12]])
想法是维护要排除的列表(或者,在此示例中,一组)。如果遇到要排除的新密钥,请将其添加到集合中并删除匹配结果(如果有)。如果遇到其键位于排除集中的行,则根本不会将该行添加到结果中。