【问题标题】:How to get unique values from a csv file如何从 csv 文件中获取唯一值
【发布时间】:2015-07-21 06:35:08
【问题描述】:

我有这个 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

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

unique_row_items = set([field.strip().lower() for field in row])

但我无法管理另一个。

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

这没有给出我想要的结果

【问题讨论】:

  • 要格式化代码或类似的预格式化文本块,请使用{} 按钮(如果您需要手动操作,这会将其缩进 4 个空格并确保前后有一个空行),而不是 I 按钮。我为你修好了这个。
  • 这是我现在尝试做的,谢谢!
  • csv 模块将为您解析文件,并将每一行作为列列表提供给您。您可以使用dict 或`set` 来存储唯一项目,具体取决于您要存储的确切内容(只是值,还是映射到值的键?)。您可以对字符串使用lower() 方法将其转换为小写。您可以使用row[0] 访问列表的第一个元素,或者使用for 循环访问每个元素。所以,尽你所能,然后告诉我们你在哪里卡住了。
  • 这是我尝试过的:
  • def unique(): rows = list(csv.reader(open('example_1.csv', 'r'), delimiter=',')) result = [] for r in rows: key = r 如果 key 不在结果中:result.append(r) 返回结果

标签: python list file csv unique


【解决方案1】:

如果你不知道如何一次完成所有事情,请逐步进行。

所以,让我们在行上写一个显式的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)

但是,如果您看一下,您是在尝试将列表用作集合;如果你只使用一个集合作为一个集合,它会更容易(也更有效);那么你就不需要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)

现在,adding 每个元素从一个集合到另一个只是 unioning 集合,因此您可以将最后两行替换为,例如:

result |= unique_row_items

而现在,如果你想把它全部变回一个大表达式,你可以:

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=',')))

另外,在 Python 2.7+ 中,您可以只使用集合推导,而不是在列表推导或生成器表达式上调用 set

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=',')))

事实上,你甚至可以通过嵌套循环将整个事情变成一个大的理解:

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

或者,或者,你不必把它变成一个大表达式:

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)

此外,正如 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}

或者,或者,看起来您的格式实际上是使用逗号而不是逗号作为分隔符,所以:

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

【讨论】:

  • 您也可以skipinitialspace=True 删除多余的空格
  • @PadraicCunningham:好点;我会将其编辑为答案。谢谢。
【解决方案2】:

要以小写形式存储所有单词,您可以对字符串使用.lower() 方法,在创建列表中所有单词的列表后,我们创建一个仅返回唯一值的set

with open("data_file.csv", "r") as data_file:
    all_words = []
    for line in data_file.readlines():
        for word in line.split(","):
            all_words.append(word.lower())

unique_words = set(all_words)
print unique_words

【讨论】:

    猜你喜欢
    • 2014-09-12
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 2013-02-10
    • 2020-09-04
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    相关资源
    最近更新 更多