繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM