【问题标题】:Skip first line in 2D list and use values跳过二维列表中的第一行并使用值
【发布时间】:2014-06-03 13:49:05
【问题描述】:

我正在处理一个项目,我有两个 csv 文件已转换为 2D 列表。我有 List1 在某个区域内有一定数量的钻孔,而 List2 有相应的多个值来计算平均值、最小值和最大值。我遇到了麻烦,因为我认为该功能是:

  1. 不跳过列表中值的标题,因此得不到整数

  2. 可能甚至没有比较这两个列表,因为我一直卡在第 1 步

到目前为止,我所拥有的是:

def height(bReader, dataList):
    print "Height function ran, but no result"
    # bReader is bores inside polygon
    # dataList BORE_DATA.csv as 2D list
    avgHeight = 0
    minN = 9e99
    maxPh = 0
    numCount = 0
    for row in bReader:
        for row2 in dataList:
            if row[0] == row2[0]:
                if row2[1] == '':
                    if row2[1][0] == '<':
                        row2[1] = row2[1][:1]
                avgHeight += row2[4]
                numCount += 1

                print row2[4]
                # Checks the minimum values of Nitrogen

                if row2[6] < minN:
                    minN = row2[6]

                 # Checks the maximum values of Phosphorous

                if row2[5] < maxPh:
                    maxPh = row2[5]


                if lastID != row2[0]:
                   # Checks for final value before moving to next bore
                    aveHeight = avgHeight / numCount
                    print row[0]
                    print "Average Water Level" + aveHeight
                    print "Minimum Nitrogen" + minN
                    print "Maximum Phosphorous" + maxPh
                    avgHeight = 0
                    minN = 9e99
                    maxPh = 0
                    numCount = 0
                lastID = row[0]

这是回溯错误:

Traceback (most recent call last):
  File "C:\Users\Lounge\Desktop\V2\ReRun V2.py", line 39, in main
    height(levelsList, bdataList)
  File "C:\Users\Lounge\Desktop\V2\ReRun V2.py", line 263, in height
    for row in bReader:
TypeError: 'function' object is not iterable

样本数据:

List1 数据

REFERENCE   EASTING NORTHING    TOC ELEVATION (m)
61610628    384835  6489341         20.24

List2 数据

BORE REF NR BORE NAME   SAMPLE DATE    water level (m)  TDSolids (mg/L) pH  N (mg/L)    P (mg/L)
61610628    JP20B   23/06/2000              3.71        430      8.8        0.28        0.007
61610628    JP20B   27/10/2000              3.18        610      7.2        1.3        0.019

【问题讨论】:

  • “遇到麻烦” - 这到底是什么意思?
  • 追溯或样本数据将是无价的。如果您真的只是因为第一行错误而遇到麻烦,那么cols = dataList.pop(0) 会删除它。

标签: python list csv compare


【解决方案1】:

我对程序进行了一些更改以使其运行。要考虑的要点是:

  • 任何要进行数值比较的值都必须转换为适当的数据类型,因为如果从 csv 导入,它们将默认为字符串;
  • 要获得 maxPH,您需要检查 > 而不是
  • 我已将每个钻孔的摘要信息移到内部循环之外,这样就无需检查 id 是否已更改;
  • 我还在外循环内初始化了 ave、max、min 变量,以便为每个孔重置它们;
  • 从您提供的数据看来,水位应该是row2[3] 而不是row2[4];
  • 我已经删除了围绕检查 if row2[1] == '': 的逻辑逻辑,因为它似乎是多余的。

这是修改后的代码:

def height(bReader, dataList):
    print("\nIn height function...")
    # bReader is bores inside polygon
    # dataList BORE_DATA.csv as 2D list
    for row in bReader:
        # initialise measurements for each bore
        avgHeight = 0
        minN = 9e99
        maxPh = 0
        numCount = 0

        for row2 in dataList:
            if row[0] == row2[0]:
                avgHeight += float(row2[3])
                numCount += 1

                print("Water level: {0}".format(row2[3])) # water level

                # Checks the minimum values of Nitrogen
                if float(row2[6]) < minN:
                    minN = float(row2[6])

                 # Checks the maximum values of Phosphorous
                if float(row2[5]) > maxPh:
                    maxPh = float(row2[5])

       # Checks for final value before moving to next bore
        aveHeight = avgHeight / numCount
        print row[0]
        print("Average Water Level: {0}".format(aveHeight))
        print("Minimum Nitrogen: {0}".format(minN))
        print("Maximum Phosphorous {0}".format(maxPh))
        avgHeight = 0
        minN = 9e99
        maxPh = 0
        numCount = 0


# added below for test
import csv

# create file objects and readers
f1, f2 = open('list1.csv', 'rb'), open('list2.csv', 'rb')
r1 = csv.reader(f1, delimiter=',', quotechar='"')
r2 = csv.reader(f2, delimiter=',', quotechar='"')

# create lists from readers
l1 = [[col for col in row] for row in r1]
l2 = [[col for col in row] for row in r2]

# check first couple of rows from lists
print('\nSample data from list 1\n' + '-'*23) 
for row in  l1[:2]: print(row)
print('\nSample data from list 2\n' + '-'*23) 
for row in l2[:3]: print(row)

# call function without headings from first rows
height(l1[1:], l2[1:])

产生以下输出:

Sample data from list 1
-----------------------
['REFERENCE', ' EASTING NORTHING', ' TOC ELEVATION (m)']
['61610628', ' 6489341', ' 20.24']

Sample data from list 2
-----------------------
['BORE REF', ' NR BORE NAME', ' SAMPLE DATE', ' water level (m)', ' TDSolids', '(mg/L) pH', ' N (mg/L)', ' P (mg/L)']
['61610628', ' JP20B', ' 23/06/2000', ' 3.71', ' 430', ' 8.8', ' 0.28', ' 0.007']
['61610628', ' JP20B', ' 27/10/2000', ' 3.18', ' 610', ' 7.2', ' 1.3', ' 0.019']

In height function...
Water level:  3.71
Water level:  3.18
61610628
Average Water Level: 3.445
Minimum Nitrogen: 0.28
Maximum Phosphorous 8.8

希望这可以为您解决问题。

【讨论】:

  • @Matt Button 我已经修改了我的答案,试图解决导致错误结果的逻辑问题以及引发 Python 错误的问题。
  • 原来我有一个缩进错误,所以现在显示了一些值,我只是在修改平均水位输出。非常感谢,代码非常有帮助:)
【解决方案2】:

从跟踪来看,您传递给函数的参数似乎不是一个列表,而是一个函数。您调用height(...) 的代码将是错误所在。

很抱歉没有将此作为评论发布,我没有这样做的声誉。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    • 2021-06-17
    • 1970-01-01
    • 2013-03-29
    • 2021-11-05
    • 2016-11-09
    • 1970-01-01
    相关资源
    最近更新 更多