在Python中使用CSV创建数组,同时限制使用的列

时间:2016-03-21 15:25:39

标签: python arrays list sorting csv

我正在处理具有以下格式的CSV文件

ST  1   2   3  4
WA  10  10  5  2
OR  0   7   3  9
CA  11  5   4  12
AZ  -999    0   0 11 

第一行代表1-4天的#。我希望能够获取每个状态的数据,例如WA, 10, 10, 5, 2并创建一个数组,其中只包含该行中已排序的数字。如果我省略第一个是WA的索引,我可以使用。

sorted(list, key=int) 

这样做会给我一个列表[2,5,10,10]

我想做的是

  1. 阅读CSV的每一行。
  2. 使用数字数据创建数字数组。
  3. 使用数组(百分比排名)
  4. 运行一些计算
  5. 将计算值与正确的状态字段组合在一起。例如,如果我想为WA的数组添加值3。

    b.insert(list[4]), 3)
    

    获取

    [2,3,5,10,10] 
    

    所以我可以计算排名。 (注意:我无法使用scipy,所以我必须使用我已经想出的函数来计算排名。)

  6. 通过将状态和等级值写入新的csv来结束,例如。

    ST  Rank
    WA  30
    CA  26
    OR  55
    

    其中Rank是数组中给定值的等级。

  7. 我对python很新,所以任何帮助或指针都会非常感激。我也只能使用基本的python模块。(numpy,csv ....等)

    更新代码:

       with open(outputDir+"needy.csv", 'rb') as f:
       first = {row[0]: sorted(row[1:], key=int) for row in list(csv.reader(f))}
    
       for key, value in first.items():
            if addn in first:
                g= "yes"
                print key, addn, g
                #print d
            else:
                g= "no"
                print key, addn, g
    
            value.append(300)
            value.append(22)
            value = sorted(value, key=int)
    
            print "State:", key, value
    

    当我这样做时,我追加的值将被添加并且dict将被正确排序,但是当我将n定义为值时,它将不会是fund。以下示例。

    {'WA': ['1', '1', '1', '2', '2', '2', '3', '4', '4', '4', '5', '5', '5', '5', '6', '6', '7', '7', '8', '8', '8', '8', '9', '10', '10', '10', '10', '11', '11'}
    

    如果我先打印出来就会发生上述情况。 如果我使用for循环并将addn指定为11作为全局函数,我得到。

    WA 11 no
    State: WA ['1', '1', '1', '2', '2', '2', '3', '4', '4', '4', '5', '5', '5',    '5', '6', '6', '7', '7', '8', '8', '8', '8', '9', '10', '10', '10', '10', '11', '11',..]
    

    因为11是键的一部分,它应该返回是等等。

1 个答案:

答案 0 :(得分:1)

您可以使用简单的命令和字典来整理数据:

fid = open('out.txt')  # Just copy what you put in your question inside a file.
l = fid.readlines()  # Read the whole file into a list.
d = {}  # create a dictionary.
for i in l:
    s = i.split()  # split the list using spaces (default)
    d[s[0]] = [int(s[j]) for j in range(1,len(s))] # list comprehension to transform string into its for you number lists.

print(d)

,结果是:

{'CA': [11, 5, 4, 12], 'ST': [1, 2, 3, 4], 'OR': [0, 7, 3, 9], 'WA': [10, 10, 5, 2], 'AZ': [-999, 0, 0, 11]}

从这一点开始,您可以对字典中的条目执行任何操作,包括追加。

 d['CA'].append(3)
编辑:@ J.R.W。按照我推荐的方式构建字典,然后是你的代码(加上我给出的更正):

fid = open('out.txt')  # Just copy what you put in your question inside a file.
l = fid.readlines()  # Read the whole file into a list.
first = {}  # create a dictionary.
for i in l:
    s = i.split()  # split the list using spaces (default)
    first[s[0]] = [int(s[j]) for j in range(1,len(s))] # list comprehension to transform string into its for you number lists.

print(first)
addn = 11
for key, value in first.items():
    if addn in value:
        g= "yes"
        print(key, addn, g)
        #print d
    else:
        g= "no"
        print(key, addn, g)

    value.append(300)
    value.append(22)
    value = sorted(value, key=int)

    print("State:", key, value)

,结果:

{'ST': [1, 2, 3, 4], 'CA': [11, 5, 4, 12], 'OR': [0, 7, 3, 9], 'AZ': [-999, 0, 0, 11], 'WA': [10, 10, 5, 2]}
ST 11 no
State: ST [1, 2, 3, 4, 22, 300]
CA 11 yes
State: CA [4, 5, 11, 12, 22, 300]
OR 11 no
State: OR [0, 3, 7, 9, 22, 300]
AZ 11 yes
State: AZ [-999, 0, 0, 11, 22, 300]
WA 11 no
State: WA [2, 5, 10, 10, 22, 300]

,当11存在时(你自己的测试),则表示是,而当它不存在时表示否。