Python提取唯一的CSV行

Python提取唯一的CSV行,python,csv,set,unique,Python,Csv,Set,Unique,我试图在Python中获取CSV的每一行的第一次出现。然而,我面临一个问题。我的CSV文件如下所示: 1,2,3,a,7,5,y,0 1,2,3,a,3,5,y,8 1,2,3,a,5,3,y,7 1,2,3,d,7,5,n,0 1,2,3,d,3,5,n,8 1,2,3,d,5,3,n,7 2,3,4,f,4,6,y,9 2,3,4,f,5,6,y,9 2,3,4,f,7,3,y,9 2,3,4,e,3,5,n,9 2,3,4,e,0,7,n,9 2,3,4,e,5,8,n,9 我尝试了这种

我试图在Python中获取CSV的每一行的第一次出现。然而,我面临一个问题。我的CSV文件如下所示:

1,2,3,a,7,5,y,0
1,2,3,a,3,5,y,8
1,2,3,a,5,3,y,7
1,2,3,d,7,5,n,0
1,2,3,d,3,5,n,8
1,2,3,d,5,3,n,7
2,3,4,f,4,6,y,9
2,3,4,f,5,6,y,9
2,3,4,f,7,3,y,9
2,3,4,e,3,5,n,9
2,3,4,e,0,7,n,9
2,3,4,e,5,8,n,9
我尝试了这种方法,以基于其中一列获取第一次出现的唯一值

def unique():
    rows = list(csv.reader(open('try.csv', 'r'), delimiter=','))
    columns = zip(*rows)
    uniq = set(columns[1])

    indexed = defaultdict(list)

    for x in uniq:
        i = columns[1].index(x)
        indexed[i] = rows[i]

    return indexed
它适用于一个唯一的列值集。但是,

  • 我想将列[1]和列[6]设置为唯一值
  • 棘手的是,列[6]总是y或n。如果我设置它,它只返回第一个y和n列。我希望所有列[1]和[6]都是唯一的。对于每列[2]值,我需要第一次出现y行和n行。对不起,我的描述不好。所以基本上,我希望我的输出是:

  • 您的代码还有一些改进的空间,但我不想深入重写它,因为您几乎是对的。“关键点”是您需要一个复合关键点。这是一对必须是唯一的
    (r[1],r[6])
    。此外,我还冒昧地使用了用于快速查找的,但保留了行顺序

    import csv
    import collections
    
    def unique():
        rows = list(csv.reader(open('try.csv', 'r'), delimiter=','))
        result = collections.OrderedDict()
        for r in rows:
            key = (r[1],r[6])  ## The pair (r[1],r[6]) must be unique
            if key not in result:
                result[key] = r
    
        return result.values()
    
    from pprint import pprint
    pprint(unique())
    
    制作:

    [['1', '2', '3', 'a', '7', '5', 'y', '0'],
     ['1', '2', '3', 'a', '7', '5', 'n', '0'],
     ['2', '3', '4', 'f', '4', '6', 'y', '9'],
     ['2', '3', '4', 'f', '3', '5', 'n', '9']]
    


    您的代码还有一些改进的空间,但我不想深入重写它,因为您几乎完全正确。“关键点”是您需要一个复合关键点。这是一对必须是唯一的
    (r[1],r[6])
    。此外,我还冒昧地使用了用于快速查找的,但保留了行顺序

    import csv
    import collections
    
    def unique():
        rows = list(csv.reader(open('try.csv', 'r'), delimiter=','))
        result = collections.OrderedDict()
        for r in rows:
            key = (r[1],r[6])  ## The pair (r[1],r[6]) must be unique
            if key not in result:
                result[key] = r
    
        return result.values()
    
    from pprint import pprint
    pprint(unique())
    
    制作:

    [['1', '2', '3', 'a', '7', '5', 'y', '0'],
     ['1', '2', '3', 'a', '7', '5', 'n', '0'],
     ['2', '3', '4', 'f', '4', '6', 'y', '9'],
     ['2', '3', '4', 'f', '3', '5', 'n', '9']]
    


    这里有一个替代实现

    从数据集中读入每一行。我们使用
    defaultdict(list)
    存储所有行,基于每行两列索引。当从数据集中读入一行时,它将根据该行的两列索引键追加到
    defaultdict

    最后,我们扫描
    defaultdict
    。我们需要数据集中与索引匹配的第一行,因此返回对应于两列索引的
    uniq[0]

    来源 输出
    这里有一个替代实现

    从数据集中读入每一行。我们使用
    defaultdict(list)
    存储所有行,基于每行两列索引。当从数据集中读入一行时,它将根据该行的两列索引键追加到
    defaultdict

    最后,我们扫描
    defaultdict
    。我们需要数据集中与索引匹配的第一行,因此返回对应于两列索引的
    uniq[0]

    来源 输出
    旧主题,但对其他主题可能有用:如果您在Unix环境中,为什么不调用外部
    uniq
    命令?这样,您就不必重新编写此代码,并将受益于可能更好的性能。

    旧主题,但对其他主题可能有用:如果您在Unix环境中,为什么不调用外部
    uniq
    命令?这样,您就不必重新编写此代码,并且可以从潜在的更好性能中获益。

    您能告诉我如何获得修改后的所需输出吗?我只能得到第[6]列中带有“n”的列,但无法从第[6]列中得到最后一列=y@abn快速而肮脏的破解方法是用
    if key not in result:
    替换
    if key not in result和r[6]=='n':
    。如果您有其他更改,请询问其他问题。您能告诉我如何获得修改后的所需输出吗?我只能得到第[6]列中带有“n”的列,但无法从第[6]列中得到最后一列=y@abn快速而肮脏的破解方法是用
    if key not in result:
    替换
    if key not in result和r[6]=='n':
    。如果您有其他更改,请询问其他问题。
    [['2', '3', '4', 'f', '4', '6', 'y', '9'], ['2', '3', '4', 'f', '3', '5', 'n', '9'], ['1', '2', '3', 'a', '7', '5', 'y', '0'], ['1', '2', '3', 'a', '7', '5', 'n', '0']]