在Python中从列表中移除值
我有一个很大的文件,里面有很多名字和对应的数值,所有内容都在一行上,用空格分开:
name1 name2 name3....
在这长长的名字后面,是一系列与这些名字对应的数值。数值可以是0到4之间的数字,或者是na。我想做的是整理这个数据文件,把所有值为na
的名字和数值都去掉。
比如,这个文件最后一行的内容是这样的:
namenexttolast nameonemore namethelast 0 na 2
我希望得到的结果是:
namenexttolast namethelast 0 2
我该怎么用Python来实现这个呢?
6 个回答
4
s = "name1 name2 name3 v1 na v2"
s = s.split(' ')
names = s[:len(s)/2]
values = s[len(s)/2:]
names_and_values = zip(names, values)
names, values = [], []
[(names.append(n) or values.append(v)) for n, v in names_and_values if v != "na"]
names.extend(values)
print ' '.join(names)
更新
在保罗的建议后做了一些小改进。我知道这个列表推导式有点不符合Python的风格,因为它利用了list.append
返回None
这个特点,所以两个append
的表达式都会被执行,结果会生成一个全是None
的列表,然后立刻被丢掉。
5
假设你把名字读进一个列表,然后把对应的值读进另一个列表。一旦你有了一个叫 names
的名字列表和一个叫 values
的值列表,你就可以做一些操作,比如:
result = [n for n, v in zip(names, values) if v != 'na']
现在 result
是一个包含所有值不等于 "na" 的名字的列表。
1
我同意Justin的看法,使用zip函数是个好主意。问题在于如何把数据放进两个不同的列表里。下面是一个应该能正常工作的建议。
reader = open('input.txt')
writer = open('output.txt', 'w')
names, nums = [], []
row = reader.read().split(' ')
x = len(row)/2
for (a, b) in [(n, v) for n, v in zip(row[:x], row[x:]) if v!='na']:
names.append(a)
nums.append(b)
writer.write(' '.join(names))
writer.write(' ')
writer.write(' '.join(nums))
#writer.write(' '.join(names+nums)) is nicer but cause list to be concat