如何获取文本文件第一列的唯一元素?

时间:2018-01-01 21:19:01

标签: python list-comprehension

我正在处理一个文本文件,其列由制表符分隔。我想获取第一列的所有唯一值。

文字输入例如:

"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: Lambda function in List Comprehensions而且我没有理解你必须使用括号来确保正确的执行顺序。我得到相同的结果。

8 个答案:

答案 0 :(得分:3)

您可以使用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))

答案 1 :(得分:2)

可能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']

答案 2 :(得分:1)

您可以使用正则表达式:

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']

答案 3 :(得分:1)

之后

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)) 

警告:这可能会重新排列您的唯一身份

答案 4 :(得分:1)

尝试Pandas

import pandas as pd

df = pd.read_csv(filename, sep='\t')
uniques = df[df.columns[0]].unique()

答案 5 :(得分:1)

寻找独特元素时set()是一个很好的解决方案:

def getData(fin):
    with open(fin, 'r') as input:
    first_cols = list(set([line.split("\\")[0] for line in input.readlines()]))

答案 6 :(得分:0)

你的列表理解需要以表达式而不是lambda开头。目前,您的代码只创建了一个lambdas列表(请注意,最外面的括号包含一个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)您的[1:]变量将包含第一列中的所有条目,包括重复项。

您可以修复这些错误并简化代码:

uniques

答案 7 :(得分:0)

如果订单无关紧要,请尝试这种方法,

打开文件,然后只分割单词,正如您所说,第一列始终是您想要的,只需要您需要的内容并保留剩余的内容。

with open('file.txt','r') as f:
    print(set([list(line)[0] for line in f]))

输出:

{'b', 'a', 'c'}