[英]How to get the unique elements of the first column of a text file?
我正在处理一个文本文件,其列由制表符分隔。我想获取第一列的所有唯一值。
文字输入,例如:
"a\t\xxx\t..\zzz\n
a\t\xxx\t....\n
b\t\xxx\t.....\n
b\t\xxx\t.....\n
c\t\xxx\t.....\n"
因此,在这种情况下,我想获取一个数组: uniques=["a","b","c"]
码:
def getData(fin):
input = open(fin, 'r',encoding='utf-16')
headers=input.readline().split()
lines=input.readlines()[1:]
uniques=[(lambda line: itertools.takewhile(lambda char: char!='\t',line))for line in lines]
而不是所需的值,我得到的列表:
<function getData.<locals>.<listcomp>.<lambda> at 0x000000000C46DB70>
我已经读过这篇文章Python:List Comprehensions中的Lambda函数 ,我不明白您必须使用括号来确保正确的执行顺序,但我仍然得到相同的结果。
您可以只使用split()
:
def getData(fin):
input = open(fin, 'r',encoding='utf-16')
headers=input.readline().split()
lines=input.readlines()[1:]
uniques=[line.split('\t')[0] for line in lines]
请注意,这不会产生唯一的值,而是会产生每一行的值。 要使其独特,请执行以下操作:
uniques = list(set(uniques))
可能是csv可以简化您的问题:
>>> import csv
>>> with open(fin, 'rb') as csvfile:
... spamreader = csv.reader(csvfile, delimiter='\t')
... list(set( row[0] for row in spamreader ))
['a', 'c', 'b']
您可以使用正则表达式:
import re
s = """
a\txxx\t..\zzz\n
a\txxx\t....\n
b\txxx\t.....\n
b\txxx\t.....\n
c\txxx\t.....\n"
"""
new_data = re.findall('(?<=\n\s\s\s)[a-zA-Z]', s)
uniques = [a for i, a in enumerate(new_data) if a not in new_data[:i]]
输出:
['a', 'b', 'c']
后
lines=input.readlines()[1:] # reads all lines after the header
# you read already and skips the 1st one
uniques = list(set(x.split('\t')[0] for x in lines))
警告:这可能会重新排列您的独特商品
尝试熊猫
import pandas as pd
df = pd.read_csv(filename, sep='\t')
uniques = df[df.columns[0]].unique()
当寻找唯一元素时, set()
是一个很好的解决方案:
def getData(fin):
with open(fin, 'r') as input:
first_cols = list(set([line.split("\\")[0] for line in input.readlines()]))
您的列表理解需要以表达式而不是lambda开头。 当前,您的代码仅创建了一个lambda列表(请注意,最外面的括号包含lambda,而不是表达式)。 您可以这样解决:
def getData(fin):
input = open(fin, 'r',encoding='utf-16')
headers=input.readline().split()
lines=input.readlines()[1:]
uniques=[itertools.takewhile(lambda char: char!='\t',line) for line in lines]
此代码中仍然存在几个错误:(1)到readlines()时,第一行已从输入缓冲区中删除,因此您可能应该删除[1:]
。 (2)您的uniques
变量将具有第一列中的所有条目,包括重复项。
您可以修复这些错误并简化代码,如下所示:
with open(fin, 'r',encoding='utf-16') as input:
headers=input.next().split('\t')
uniques = set(line.split('\t')[0] for line in input)
uniques = list(uniques)
如果顺序无关紧要,请尝试这种方法,
打开文件,然后将单词分开,正如您所说的那样,第一列始终是您想要的,而剩下的内容就一直保留着。
with open('file.txt','r') as f:
print(set([list(line)[0] for line in f]))
输出:
{'b', 'a', 'c'}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.