在Python中从列表中移除值

0 投票
6 回答
1370 浏览
提问于 2025-04-16 01:59

我有一个很大的文件,里面有很多名字和对应的数值,所有内容都在一行上,用空格分开:

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

撰写回答