如何使用布尔值从tabdelimited csv文件创建具有唯一提及的列表字典

2024-10-03 13:28:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个大的tab deltimized csv文件:第一个tab用于情感词,第二个tab用于八种基本情感,加上值positivenegative,最后一个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:

文件的第一行和最后一行是空的,正如我在每个注释的答案中提到的。你知道吗


Tags: 文件csvinimporttab情感pprintnegative
3条回答

我想你已经接近答案了。但当你调用csv.reader文件,您没有指定分隔符(这意味着它默认为逗号作为分隔符)

>>> from itertools import groupby
>>> l = map(str.split, open('NRC-Emotion-Lexicon-Wordlevel-v0.92.txt').readlines())
>>> f = lambda x: x[1]
>>> {k:set(e[0] for e in v) for k,v in groupby(sorted(filter(bool, l), key=f), f)}
{'anger': {'snarling', 'snarl'}, 'anticipation': {'snarling', 'snarl'}, 'disgust': {'snarling', 'snarl'}, 'fear': {'snarling', 'snarl'}, 'joy': {'snarling', 'snarl'}, 'negative': {'snarling', 'snarl'}, 'positive': {'snarling', 'snarl'}, 'sadness': {'snarling', 'snarl'}, 'surprise': {'snarling', 'snarl'}, 'trust': {'snarling', 'snarl'}}

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

例如:

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)

根据评论编辑

from collections import defaultdict

d = defaultdict(list)
with open(filename) as infile:
    for row in infile:
        if row.strip():
            val = row.split()
            if val[2] == '1':
                d[val[0]].append(val[1])
print(d)

相关问题 更多 >