【问题标题】:Python Array error: "list indices must be integers or slices, not list"Python 数组错误:“列表索引必须是整数或切片,而不是列表”
【发布时间】:2017-06-30 21:44:18
【问题描述】:

我是 Python 新手,正在尝试将两个字符串添加到键值数组中。

这是我的代码:

import os
from numpy import genfromtxt
import re



script_dir = os.path.dirname(r'C:/Users/Kenny/Desktop/pythonReports/')

my_data = genfromtxt('allreports.csv', delimiter=',', dtype=None)


pattern_id = re.compile(r'(?<=eventid\=)(.*)(?=&key)', flags=re.DOTALL)
pattern_key = re.compile(r'(?<=key\=)(.*)(?=&cb)', flags=re.DOTALL)

id_key = {}

for row in my_data:
    eventid = pattern_id.findall(row.decode('utf-8'))
    eventkey = pattern_key.findall(row.decode('utf-8'))
    id_key[eventid] = eventkey

    print(id_key)

这基本上需要一个 url,并从中提取两件事。然后我想用这两个信息创建一个关联数组(键/值)。

示例数据为:{123456, 412F5BFE1D8A33BC}

并且有数百个 url,因此是数组的原因。

我得到的错误是:

Traceback (most recent call last):
  File "script.py", line 20, in <module>
    id_key[eventid] = [eventkey]
TypeError: list indices must be integers or slices, not list

感谢您对此的任何帮助,如果需要,我正在使用 Python3。

【问题讨论】:

  • 这个错误很容易解释。我认为您正在寻找的是字典,因此将 `id_key = []` 替换为 `id_key = {}`
  • re.findall 返回一个列表,而不是一个整数
  • 列表不是关联数组。列表是序列。如果你想要一个关联数组,那就是 dicts 的用途。
  • @Ludisposed 哎呀,这就是我最初拥有它的方式id_key = {},我为了测试目的进行了更改。 @Vinícius Aguiar 谢谢,我不知道 re.findall 返回了一个列表。

标签: python list


【解决方案1】:

首先,您需要一个关联数组,因此请使用字典而不是列表。其次,findall 返回一个列表并且您需要该元素。

id_key = {} # replaced [] with {}

for row in my_data:
    eventid = pattern_id.findall(row.decode('utf-8'))[0] # note added [0]
    eventkey = pattern_key.findall(row.decode('utf-8'))[0]
    id_key[eventid] = eventkey

但如果你想要风格点,我建议你使用字典理解

id_key = {pattern_id.findall(row.decode('utf-8'))[0]: 
          pattern_key.findall(row.decode('utf-8'))[0] for row in my_data}

或另一种方式

def id_and_key(line):
    return (pattern_id.findall(line)[0],  
            pattern_key.findall(line)[0])

id_key = dict(id_and_key(row.decode('utf-8')) for row in my_data)

【讨论】:

  • 太好了,这行得通!我最初有id_key = {},但使用 [] 进行测试,在粘贴代码时忘记改回来。感谢您指出 re.compile 返回一个列表,现在这很有意义。
  • 对于id_key,您能否解释或链接到他们{item1:item2 for row in my_data} 工作的文档?将 for 循环作为声明的一部分?
  • @Kenny 抱歉,我的意思是说findall 返回一个列表。在尝试了解dict comprehensions之前,您需要了解list comprehensions
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多