【问题标题】:TypeError: list indices must be integers, not unicode in python codeTypeError:列表索引必须是整数,而不是python代码中的unicode
【发布时间】:2016-09-09 19:18:24
【问题描述】:

我使用 split() 函数将字符串转换为列表 time = time.split(),这就是我的输出的样子:

[u'1472120400.107']
[u'1472120399.999']
[u'1472120399.334']
[u'1472120397.633']
[u'1472120397.261']
[u'1472120394.328']
[u'1472120393.762']
[u'1472120393.737']

然后我尝试使用print time[1] 访问列表的内容,这会导致索引超出范围错误(因为一个列表中只存储了一个值)。我检查了其他人发布的问题并使用了print len(time)。这是它的输出:

1
[u'1472120400.107']
1
[u'1472120399.999']
1
[u'1472120399.334']
1
[u'1472120397.633']
1
[u'1472120397.261']
1
[u'1472120394.328']
1
[u'1472120393.762']
1
[u'1472120393.737']

我在一个 for 循环中完成这整个事情,因为我动态地获取日志并且必须只提取时间。 这是我的代码的一部分:

line_collect = lines.collect() #spark function
for line in line_collect :
    a = re.search(rx1,line)
    time = a.group()
    time = time.split()
    #print time[1] #index out of range error which is why I wrote another for below
    for k in time :
        time1 = time[k]#trying to put those individual list values into one variable but get type error
        print len(time1)

我收到以下错误:

时间1 = 时间[k]
TypeError: 列表索引必须是整数,而不是 unicode

谁能告诉我如何将这些单个列表值中的每一个读取到一个列表中,以便我可以使用单个索引[值]访问它们中的每一个。我是 python 新手。

我需要的输出:

时间=['1472120400.107','1472120399.999','1472120399.334','1472120397.633','1472120397.261','1472120394.328','1472120393.7693.7']4'7123.769.3',7

这样我就可以使用 time[1] 给出 1472120399.999 作为结果。

【问题讨论】:

  • 你需要的输出是什么?
  • 我已将输出添加到问题中。

标签: python-2.7 apache-spark pyspark


【解决方案1】:

更新:我误解了你想要什么。您已经有了正确的输出,它是一个字符串。在字符串之前有一个u 的原因是因为它是一个 16 位的 unicode 字符串。 u 是一个 python 标志,用于将其与普通字符串区分开来。将其打印到屏幕上将为您提供正确的字符串。像使用任何其他字符串一样正常使用它。

time = [u'1472120400.107']  # One element just to show

for k in time:
    print(k)

【讨论】:

  • 当我打印我的newlst 时,它仍然是空的。
  • 然后我在主循环中尝试:newlst = [] newlst.append(time) print newlst[] 但值仍然在不同的列表中。
  • 我的原始代码没有将所有值放入一个列表中。每次提取单个值时,它都会为此创建一个新列表。这就是为什么我得到列表 [1] 的索引超出范围错误但得到列表 [0] 的结果。如果我没记错的话,它会创建 8 个不同的列表。
【解决方案2】:

使用for 循环遍历列表将一次给您一个值,而不是索引本身。考虑使用枚举:

for k, value in enumerate(time):
    time1 = value # Or time1 = time[k]
    print(time1)

或者只是获取价值本身:

for k in time:
    time1 = k
    print(time1)

--

另外,Python 是从零开始的语言,因此要从列表中取出第一个元素,您可能需要使用 time[0]

【讨论】:

  • 我得到的输出与我的旧输出相同。我已将所需的输出添加到我的问题中。
【解决方案3】:

感谢您的帮助。我终于把代码弄对了:

newlst = []
for line in line_collect :
    a = re.search(rx1,line)
    time = a.group()
    newlst.append(float(time))
print newlst

这会将整个列表值放入一个列表中。 输出:

[1472120400.107, 1472120399.999, 1472120399.334, 1472120397.633, 1472120397.261、1472120394.328、1472120393.762、1472120393.737]

【讨论】:

  • 我认为您的原始代码可以工作,因为您有一个内部循环。您可以将其转换为在内部循环中浮动。原始问题显示所需的输出是字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-09
  • 1970-01-01
  • 2018-01-03
  • 1970-01-01
  • 2014-02-19
相关资源
最近更新 更多