2014-02-21 68 views
-2

這是我的列表;從數據庫輸出輸入爲字符串:如何將格式錯誤的列表轉換爲python中的int列表

list_=(('[96, 71, 16, 81, 21, 56, 91]',),) 

我的目標是將其轉換成整數的列表:[96, 71, 16, 81, 21, 56, 91]

我嘗試:

import ast 
print ast.literal_eval(list_[0][0]) 

預期輸出

Output:[96, 71, 16, 81, 21, 56, 91]

然而,解決方案n不與某些輸出

list_[0][0]

導致錯誤的兼容:超出範圍。

有關解決該問題的其他可能方法的任何建議?謝謝。

+7

告訴我們,*不*工作,而不是代碼中的場景,*不* – mhlester

+2

你需要知道輸入是如何產生的,可能的值。否則,這個問題是不可能解決的。 – freakish

+0

list_ [0] [0]在創建整數列表時指定列表中的元素...? – ysakamoto

回答

1
import ast 
print ast.literal_eval([y for x in list_ for y in x][0]) 
+0

如果你有'('stringstringstring',)''怎麼辦?這將製作字符串中的字符列表。 OP正在談論'IndexError's。 – 2rs2ts

+0

嗨@hwatkins,感謝您的解決方案。它工作正常,我會嘗試,看看它是否可以適合我的整體算法。 – Tiger1

+0

是的,它是一個字符串的組合。它是一個索引的東西。 – Tiger1

0

你有沒有嘗試過這樣的:

from numpy import fromstring 
fromstring(list_[0][0][1:(len(list_[0][0])-1)], sep=',', dtype='int32').tolist() 
+0

嗨@CCP,感謝您的解決方案,但我認爲hwatkins方法符合我的想法。 – Tiger1

+0

@ Tiger1不用客氣;) – CCP

1
while type(list_) is not str: 
    try: 
     list_ = list_[0] 
    except IndexError: 
     break 

現在list_是你想要的字符串。

0

而只是爲了好玩,通用untangler

from collections import Iterable 

def untangle(thing): 
    stack = [thing] 
    result = [] 
    while stack: 
     current = stack.pop() 
     if isinstance(current, basestring): 
      if current[-1] == ']': 
       current = current[1:-1] 
      for x in current.strip().split(','): 
       result.append(int(x.strip())) 
     elif isinstance(current, Iterable): 
      stack.extend(reversed(current)) 
     else: 
      print "dont know what do do with", repr(current) 
    return result 

untangle((('[96, 71, 16, 81, 21, 56, 91]',),)) 
[96, 71, 16, 81, 21, 56, 91] 
+0

嗨@cmd,感謝您的建議,它可行,但可能太長。我正在尋找一兩行代碼方法。 – Tiger1

+0

@ Tiger1我覺得它會比你想要的更多。我發佈了這個解決任何嵌套輸入的問題;) – cmd

相關問題