我正在处理一个文本文件,其列由制表符分隔。我想获取第一列的所有唯一值。
文字输入例如:
"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而且我没有理解你必须使用括号来确保正确的执行顺序。我得到相同的结果。
答案 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'}