【问题标题】:Indexing through a list in python通过python中的列表进行索引
【发布时间】:2015-11-30 14:22:43
【问题描述】:

我有一个列表,我试图循环并索引列表中每个数字的编号。总列表大约有 1500-2000 个数字,其中每个数字代表受试者的行为。我通过 Excel 表导入了数字列表:

import openpyxl
from openpyxl import load_workbook
wb = load_workbook('/data.xlsx')
ws = wb['bhv.TrialError'] 
trialerror10_22=[]
for column in ws.columns:
    for cell in column:
        trialerror10_22=(cell.value)
        print(trialerror10_22)

这一切都很好,并在列表中打印出我的 1500 左右的数字。接下来我尝试索引数字,范围从 0 到 9,并按以下顺序与标签相关联:

labels = ['C','NR', 'LR', 'BF', 'NF', 'ER', 'IR', 'LB', 'I', 'A']

def bhvread(trialerror10_22):
    test=False
    results = [0] * (max(data) + 1)
    for val in data:
        results[val] +=1
    return results


for index, val in enumerate(results):
    print(index, labels[index], val)

但是当我运行这部分时,它会显示 Index Error: list index out of range 并指向我的代码的最后一行。

输出:

0 C 1
1 NR 0
2 LR 0
3 BF 0
4 NF 0
5 ER 0
6 IR 0
7 LB 0
8 I 0
9 A 0

【问题讨论】:

  • 我看不出您的代码示例之间的联系。给bhvreaddata 是什么?你甚至在任何地方调用这个函数吗?
  • 为什么是max(data)+1?不应该是len(data) 吗?你正在枚举results,但你索引labels所以要小心至少有相同数量的元素
  • 我不明白您所说的“索引通过”列表和“接下来我尝试索引数字,范围从 0 到 9,并按此顺序与标签相关联。”如果您提供输入和预期输出的样本会有所帮助,因为您的描述非常混乱。
  • 对不起大家的困惑,我显然不精通python,但我在excel中有一列数字,我使用数据的第一部分将它带入python,它在一个名为的列表中trialerror10_22 ,当我打印出来时,它是这样的:0 0 0 3 0 0 和 1500 个数字。我想计算我的数字列表中有多少个 0 - 9。我的输出看起来像这样,但由于索引错误而不起作用。 0 C 1 1 NR 0 2 LR 0 3 BF 0 4 NF 0 5 ER 0 6 IR 0 7 LB 0 8 I 0 9 A 0
  • 并且输出的格式是错误的,它就像列表的一列和第二部分的输出..对不起,我可能让这真的很混乱跨度>

标签: python list python-3.x for-loop enumerate


【解决方案1】:

更新 2:

如果我对您的理解正确,您想要执行以下操作:

data = [0, 1, 2, 0, 1, 0, 9, 8]
#dictionary keeping track of our number counters
results = {0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0}
labels = ['C', 'NR', 'LR', 'BF', 'NF', 'ER', 'IR', 'LB', 'I', 'A']

for x in data:
    #is the data valid?
    if x >= 0 and x < 10:
        results[x] += 1 #increment the correct entry in the dict

#print everything
for i in range(10):
    print(i, labels[i], results[i])

输出

0 C 3
1 NR 2
2 LR 1
3 BF 0
4 NF 0
5 ER 0
6 IR 0
7 LB 0
8 I 1
9 A 1

原文:

问题肯定出在labels[index]

如果len(results) 大于 10,你将在第十次迭代时遇到麻烦。

示例:

results = [1,2,3,4,5,6,7,8,9,10,11]
#len(results) = 11

#first run
index    v
results [1   , 2  , 3  , 4   , 5   , 6   , 7   , 8   , 9  , 10   , 11]
labels  ['C','NR', 'LR', 'BF', 'NF', 'ER', 'IR', 'LB', 'I', 'A']

#second run
index          v
results [1   , 2  , 3  , 4   , 5   , 6   , 7   , 8   , 9  , 10   , 11]
labels  ['C','NR', 'LR', 'BF', 'NF', 'ER', 'IR', 'LB', 'I', 'A']

#More runs

#tenth run
index                                                       v
results [ 1  , 2  , 3  , 4   , 5   , 6   , 7   , 8   , 9  , 10   , 11]
labels  ['C','NR', 'LR', 'BF', 'NF', 'ER', 'IR', 'LB', 'I', 'A']

#eleventh run
index                                                              v
results [ 1  , 2  , 3  , 4   , 5   , 6   , 7   , 8   , 9  , 10   , 11]
labels  ['C','NR', 'LR', 'BF', 'NF', 'ER', 'IR', 'LB', 'I', 'A'] #INDEX ERROR!!!

目前还不清楚您要完成什么,但我希望这能让您走上正轨。

更新:

正如@Elzell 所说,您可能想使用itertools.cycle

import itertools
#...
labels_iterator = itertools.cycle(labels)

for index, val in enumerate(results):
    print(index, labels_iterator.next() , val)

【讨论】:

  • 根据您希望使用标签实现的目标,您可以使用 itertools.cycle() 循环遍历该列表。在第十一次运行中,您将使用“C”作为第 11 个标签。
猜你喜欢
  • 2018-07-01
  • 2014-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多