Python 如何使用布尔值从以制表符分隔的csv文件创建具有唯一提及的列表字典
我有一个大的tab Deltimized csv文件:第一个tab用于情感词,第二个tab用于八种基本情感,加上值Python 如何使用布尔值从以制表符分隔的csv文件创建具有唯一提及的列表字典,python,list,csv,dictionary,boolean,Python,List,Csv,Dictionary,Boolean,我有一个大的tab Deltimized csv文件:第一个tab用于情感词,第二个tab用于八种基本情感,加上值正和负,如果第二个tab值与第一个值匹配,则最后一个tab是布尔值 文件中的一个片段: snarl anger 1 snarl anticipation 0 snarl disgust 1 snarl fear 0 snarl joy 0 snarl negative 1 snarl positive 0 snarl sad
正
和负
,如果第二个tab值与第一个值匹配,则最后一个tab是布尔值
文件中的一个片段:
snarl anger 1
snarl anticipation 0
snarl disgust 1
snarl fear 0
snarl joy 0
snarl negative 1
snarl positive 0
snarl sadness 0
snarl surprise 0
snarl trust 0
snarling anger 1
snarling anticipation 0
snarling disgust 0
snarling fear 0
snarling joy 0
snarling negative 1
snarling positive 0
snarling sadness 0
snarling surprise 0
snarling trust 0
到目前为止,我的代码要执行以下操作:
import csv
from pprint import pprint
from itertools import groupby
l = list(csv.reader(open('NRC-Emotion-Lexicon-Wordlevel-v0.92.txt')))
f = lambda x: x[-1] #manipulate number to see different results
{k:[tuple(x[0:1]) for x in v] for k,v in groupby(sorted(l[1:], key=f), f)}
pprint(l)
我当前的输出不太好看:
['asylum\tanger\t0'],
['asylum\tanticipation\t0'],
['asylum\tdisgust\t0'],
['asylum\tfear\t1'],
['asylum\tjoy\t0'],
['asylum\tnegative\t1'],
['asylum\tpositive\t0'],
['asylum\tsadness\t0'],
['asylum\tsurprise\t0'],
['asylum\ttrust\t0'],
我的问题是:我如何创建一个列表字典,其中每个重复的情感词都有一个唯一的键(将10次重复减少为1次),并且仅在该字典键的列表中包含第二个tab元素(当它们的布尔值为1时)
任何形式的帮助都将不胜感激
编辑:正如其中一个回复所述,所需输出的示例如下所示:
{'snarl': ['anger', 'disgust'], #included in list due to having '1', ignoring 'positve' and 'negative'
'snarling': ['anger'], #etc...
}
编辑2:
import csv
from collections import defaultdict
d = defaultdict(list)
with open(filename) as infile:
reader = csv.reader(infile, delimiter="\t")
for row in reader:
if row[2] == '1':
d[row[0]].append(row[1])
print(d)
文件的第一行和最后一行是空的,正如我在每个注释的答案中提到的。您可以使用
集合.defaultdict
并在迭代csv.reader
对象时更新列表字典
您的标准将添加到if
语句中,注意通过int
将数字转换为整数
import csv
from collections import defaultdict
from io import StringIO
x = StringIO("""snarl anger 1
snarl anticipation 0
...
snarling surprise 0
snarling trust 0""")
d = defaultdict(list)
# replace x with open('file.csv', 'r')
with x as fin:
reader = filter(None, csv.reader(x, delimiter=' ', skipinitialspace=True))
# or, reader = filter(None, csv.reader(x, delimiter='\t'))
for word, emotion, num in reader:
if int(num):
d[word].append(emotion)
结果:
print(d)
defaultdict(list,
{'snarl': ['anger', 'disgust', 'negative'],
'snarling': ['anger', 'negative']})
您可以使用
collections.defaultdict
并在迭代csv.reader
对象时更新列表字典
您的标准将添加到if
语句中,注意通过int
将数字转换为整数
import csv
from collections import defaultdict
from io import StringIO
x = StringIO("""snarl anger 1
snarl anticipation 0
...
snarling surprise 0
snarling trust 0""")
d = defaultdict(list)
# replace x with open('file.csv', 'r')
with x as fin:
reader = filter(None, csv.reader(x, delimiter=' ', skipinitialspace=True))
# or, reader = filter(None, csv.reader(x, delimiter='\t'))
for word, emotion, num in reader:
if int(num):
d[word].append(emotion)
结果:
print(d)
defaultdict(list,
{'snarl': ['anger', 'disgust', 'negative'],
'snarling': ['anger', 'negative']})
这是一种方法。使用
defaultdict
Ex:
import csv
from collections import defaultdict
d = defaultdict(list)
with open(filename) as infile:
reader = csv.reader(infile, delimiter="\t")
for row in reader:
if row[2] == '1':
d[row[0]].append(row[1])
print(d)
按注释编辑
这是一种方法。使用
defaultdict
Ex:
import csv
from collections import defaultdict
d = defaultdict(list)
with open(filename) as infile:
reader = csv.reader(infile, delimiter="\t")
for row in reader:
if row[2] == '1':
d[row[0]].append(row[1])
print(d)
按注释编辑
我猜你几乎接近答案了。但当您调用csv.reader时,您没有指定分隔符(这意味着它默认为逗号作为分隔符)
我猜你几乎接近答案了。但当您调用csv.reader时,您没有指定分隔符(这意味着它默认为逗号作为分隔符)
我会这样做的。如果愿意,也可以使用
collections.defaultdict
(而不是setdefault
):
输出:
字典d:
{'snarl':['anger','Abost','negative'],'snarling':['anger','negative']}
以下是我的做法。如果愿意,也可以使用
collections.defaultdict
(而不是setdefault
):
输出:
字典d:
{'snarl':['anger','Abost','negative'],'snarling':['anger','negative']}
您介意给出一个输出示例吗?在理解你的想法时有困难吗want@dheiberg我根据我的回答编辑好了,你介意给我一个例子输出吗?在理解你的想法时有困难吗want@dheiberg我根据编辑了我的答案。我得到了一个
值错误:没有足够的值来解包(预期为3,得到了0)
对于reader:@Waldkamel,无法复制。您是否尝试过reader=csv.reader(x,delimiter='\t')
?我刚刚注意到我的文件实际上是一个.txt文件,但以制表符分隔。这会导致问题吗?不,扩展名txt/tab定界没有问题。正如我在其他答案中提到的:文件的第一行和最后一行是空的。这可能是个问题吗?我得到了一个ValueError:对于reader:
@Waldkamel,无法复制的单词、情感、数字行,没有足够的值来解包(预期为3,得到0)
。您是否尝试过reader=csv.reader(x,delimiter='\t')
?我刚刚注意到我的文件实际上是一个.txt文件,但以制表符分隔。这会导致问题吗?不,扩展名txt/tab定界没有问题。正如我在其他答案中提到的:文件的第一行和最后一行是空的。这可能是个问题吗?对于带有f=lambda x:x[1]
@Waldkamel的行,它给了我一个索引器:列表索引超出范围。这意味着l
不是列表的列表(可能是因为文件没有用制表符分隔)。尝试初始化l,正如我在最后一行l=map(str.split,open('tmp.txt').readlines())
中提到的,我用建议的编辑替换了l
行,但它仍然给我相同的错误消息,很遗憾……我注意到文件的第一行和最后一行是空的。这就是问题所在吗?@Waldkamel是的。。空行导致了此问题。我用一个filter
语句更新了我的答案,以消除空白行。对于带有f=lambda x:x[1]
@Waldkamel的行,我给了我一个索引器:列表索引超出范围。这意味着l
不是列表的列表(可能是因为文件没有用制表符分隔)。尝试初始化l,正如我在最后一行l=map(str.split,open('tmp.txt').readlines())
中提到的,我用建议的编辑替换了l
行,但它仍然给我相同的错误消息,很遗憾……我注意到文件的第一行和最后一行是空的。这就是问题所在吗?@Waldkamel是的。。空行导致了此问题。我已经用一个过滤器
语句更新了我的答案,以消除空白行。我也得到了这个答案的索引器:列表索引超出范围
。第一行和最后一行是空的-这会导致问题吗?没有csv
module的更新的ans我得到indexer错误:列表索引超出此答案的范围。第一行和最后一行是空的-这会导致问题吗?更新的ans没有csv
模块这给了我一个索引器:列表索引超出范围
-正如我在其他注释中提到的,文件的第一行和最后一行是空的。这就是导致错误的原因,对吗