Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用布尔值从以制表符分隔的csv文件创建具有唯一提及的列表字典_Python_List_Csv_Dictionary_Boolean - Fatal编程技术网

Python 如何使用布尔值从以制表符分隔的csv文件创建具有唯一提及的列表字典

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 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   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
模块这给了我一个
索引器:列表索引超出范围
-正如我在其他注释中提到的,文件的第一行和最后一行是空的。这就是导致错误的原因,对吗