如何从csv文件获取唯一值

nik*_*osb 0 python csv file list unique

我有这个csv文件

Cat, and, dog, bites
Yahoo, news, claims, a, cat, mated, with, a, dog, and, produced, viable, offspring
Cat, killer, likely, is, a, big, dog
Professional, free, advice, on, dog, training, puppy, training
Cat, and, kitten, training, and, behavior
Dog, &, Cat, provides, dog, training, in Eugene, Oregon
Dog, and, cat, is, a, slang, term, used, by, police, officers, for, a, male-female, relationship
Shop, for, your, show, dog, grooming, and, pet, supplies
Run Code Online (Sandbox Code Playgroud)

我想使所有单词都以小写字母开头,并创建一个列表,其中将包含上述csv文件中的所有唯一项。你有什么主意吗 提前致谢!到目前为止,我已经设法将所有单词转换为一个小字母:

unique_row_items = set([field.strip().lower() for field in row])
Run Code Online (Sandbox Code Playgroud)

但是我不能管理另一个。

def unique():

    rows = list(csv.reader(open('example_1.csv', 'r'), delimiter=','))

    result = []

    for r in rows:
        key = r
        if key not in result:
            result.append(r)
    return result
Run Code Online (Sandbox Code Playgroud)

哪个没有给出我想要的结果

aba*_*ert 5

如果您不知道如何一次完成所有操作,请分步执行。

因此,让我们for在行上写一个明确的语句:

result = []
# use `with` so the file gets closed
with open('example_1.csv', 'r') as f:
    # no need for `list` here
    rows = csv.reader(f, delimiter=',')
    for row in rows:
        # no need for `set([...])`, just `set(...)`
        unique_row_items = set(field.strip().lower() for field in row)
        for item in unique_row_items:
            if item not in result:
                result.append(item)
Run Code Online (Sandbox Code Playgroud)

但是,如果您查看此内容,则尝试将列表作为一组使用。如果仅将集合用作集合,则将更加容易(并且效率更高);那么您不需要if … in检查:

result = set()
with open('example_1.csv', 'r') as f:
    # no need for `list` here
    rows = csv.reader(f, delimiter=',')
    for row in rows:
        unique_row_items = set(field.strip().lower() for field in row)
        for item in unique_row_items:
            result.add(item)
Run Code Online (Sandbox Code Playgroud)

现在,将add一个集合中的每个元素都添加到另一个union集合中,因此您可以将后两行替换为,例如:

result |= unique_row_items
Run Code Online (Sandbox Code Playgroud)

现在,如果您想将所有内容转换成一个大表达式,则可以:

with open('example_1.csv', 'r') as f:
    result = set.union(*(set(field.strip().lower() for field in row)
                         for row in csv.reader(f, delimiter=',')))
Run Code Online (Sandbox Code Playgroud)

同样,在Python 2.7+中,您可以只使用set comprehension,而不是调用setlist comprehension或generator表达式:

with open('example_1.csv', 'r') as f:
    result = set.union(*({field.strip().lower() for field in row}
                         for row in csv.reader(f, delimiter=',')))
Run Code Online (Sandbox Code Playgroud)

实际上,您甚至可以通过嵌套循环将整个事情变成一种全面的理解:

with open('example_1.csv', 'r') as f:
    result = {field.strip().lower() 
              for row in csv.reader(f, delimiter=',')
              for field in row}
Run Code Online (Sandbox Code Playgroud)

或者,或者,您不必使其成为一个大表情:

with open('example_1.csv', 'r') as f:
    rows = csv.reader(f, delimiter=',')
    rowsets = ({field.strip().lower() for field in row} for row in rows)
    result = set.union(*rowsets)
Run Code Online (Sandbox Code Playgroud)

而且,正如Padraic Cunningham指出的那样,该csv模块提供的方言选项之一是skipinitialspace,听起来就像,所以您不再需要它strip。例如,使用大集合理解:

with open('example_1.csv', 'r') as f:
    result = {field.lower() 
              for row in csv.reader(f, delimiter=',', skipinitialspace=True)
              for field in row}
Run Code Online (Sandbox Code Playgroud)

或者,看起来您的格式确实使用逗号空间而不是逗号作为定界符,因此:

with open('example_1.csv', 'r') as f:
    result = {field.lower() 
              for row in csv.reader(f, delimiter=', ')
              for field in row}
Run Code Online (Sandbox Code Playgroud)