python中连续实数列表的随机数列表

时间:2016-01-29 18:11:34

标签: python

我在CSV文件中有以下两列数据库:

31 ID1
42 ID2
22 ID3
42 ID4

其中包含第一列中的类号和第二列中的信息(以空格分隔)。

我希望将它转换为按实数排序。第一个元素将被分配一个类号1,依此类推。但是类号必须与原始文件中的顺序相同,如下例所示:

1 ID1
2 ID2
3 ID3
2 ID4

我认为可以使用zip函数完成此操作。有人对此有任何建议吗?

2 个答案:

答案 0 :(得分:4)

您应该可以使用defaultdict和计数器来计算类标签

import csv
import itertools
import collections

ID = itertools.count(1)
labels = collections.defaultdict(lambda : next(ID))
with open('path/to/input') as infile, open('path/to/output', 'w') as fout:
    outfile = csv.writer(fout, delimiter=' ', dialect='excel')
    for val, name in csv.reader(infile, delimiter=' '):
        outfile.writerow([name.strip(), labels[val]])

编辑(某些文档):

itertools.count(1)为您提供了一组数字:1,2,3,4 ....这些将作为您的班级标签

collections.defaultdict的工作方式类似于字典,但需要一个可选的参数。当您向defaultdict询问它没有的键的值时,它会创建该键,将其添加到字典中,并为其提供可选参数指定的默认值。我给它一个默认值,要求我创建的itertools.count对象的下一个值。因此,如果在defaultdict中添加一个新值,它将获得一个新的类标签

因此,对于输入文件中的每一行,我通过询问defaultdict来获取类标签。如果之前已经看到了值(比如42),它会给我以前分配的类标签。但是如果之前没有看到过该值,它会为该值创建一个新的类标签(因为defaultdict和itertools.count的工作方式),并为我提供了新的类标签

答案 1 :(得分:0)

您可以使用list来存储类而不重复,然后使用element's index + 1作为新的"类ID",例如:

# First, import data -- you may use the `csv` module also
filename = 'test.csv'
encoding = 'utf-8'
with open(filename) as fobj:
    data = fobj.read().decode(encoding)
data = [line.split() for line in lines.split('\n')]

# Create the classes list -- can't use a `set` because we need it ordered
classes = []
for x, y in data:
    if y not in classes:
        classes.append(y)

# To see the final result:
for x, y in data:
    print x, classes.index(y) + 1