2012-07-10 102 views
0

我有一些代碼可能會返回一個單一的int或列表。當它返回一個int時,我需要將它轉換爲只包含int的列表。如何將int轉換爲列表?

我嘗試以下,但它不工作:

newValue = list(retValue) 

顯然,我不能這樣做,因爲list(some int)整數不是迭代。有沒有另外一種方法呢?

在此先感謝!

+1

「我有一些代碼可能會返回一個int或列表。「**爲什麼它以這種方式行事**?它是你的代碼嗎?爲什麼不把它調整爲總是返回相同類型的東西呢?它有一個很好的理由說明它爲什麼返回一個int(而不是一個帶有1個int的列表) ),或者沒有... – 2012-07-10 23:00:25

回答

9

定義自己的功能:

def mylist(x): 
    if isinstance(x,(list,tuple)): 
     return x 
    else: 
     return [x] 


>>> mylist(5) 
[5] 
>>> mylist([10]) 
[10] 
+0

鑄造[x]的問題是,如果x已經是一個列表,這將使它成爲一個嵌套列表,這是不希望的。任何方式來避免這種情況? – turtlesoup 2012-07-10 21:46:00

+0

@Jimster – 2012-07-10 21:48:55

+0

'如果不是isinstance(x,(tuple,list)):return [x]'...也許 – 2012-07-10 21:49:19

2
if isinstance(x,list): return x 
else: return [x] 

就是這樣。

當然,這不會對其他迭代類型進行智能處理,但並不清楚你是否想將所有迭代對象看作是列表(也許你會,也許你不會)。

7

在Python中,鴨子打字是最好的 - 不要測試某個特定的類型,只是測試它是否支持你需要的方法(「我不在乎它是否是鴨子,只要它嘎嘎聲」)。

def make_list(n): 
    if hasattr(n, '__iter__'): 
     return n 
    else: 
     return [n] 

a = make_list([1,2,3]) # => [1,2,3] 
b = make_list(4)   # => [4] 
+1

用於鴨子打字的+1 ...「如果它看起來像一隻鴨子,鴨子像鴨子一樣,它肯定是一隻鴨子。」 – RobB 2012-07-10 22:05:21

+0

用於鴨子打字的+1。 – 2012-07-10 23:11:10

+2

用於鴨子打字的+1,_but_,你可以用['isinstance(n,collections.Iterable)']獲得與我認爲相同的行爲(http://docs.python.org/library /collections.html#collections.Iterable)。另外,OP要求列表;爲了得到像列表一樣的東西,但消除了類似發生器和類字典的東西,['collections.Sequence'](http://docs.python.org/library/collections.html#collections.Sequence)非常方便。 – senderle 2012-07-10 23:40:52

2

嘗試將變量轉換爲int。如果它已經是一個int,這是一個無操作。如果它是一個列表,則會引發TypeError。

try: 
    return [int(x)] 
except TypeError: 
    return x 

儘管如果異常情況發生的概率很高,但通常會使用異常來控制流量。這是因爲處理異常是一項相當長的任務。

另一種方法是使用isinstance運算符。

if isinstance(x, list): 
    return x 
else: 
    return [x] 
2
listInt = intVal if isinstance(intVal,list) else [intVal] 

這將始終返回一個列表,如果值不是一個列表。 希望這有助於

+0

+1。 Python三元組使用不足... – dawg 2012-07-11 01:55:26

2

這真的只是Hugh Bothwell的答案的變化,但是...如果你想國家的最先進的鴨打字,你可以得到的hasattr(rval, '__iter__')語義在一個更具吸引力的包isinstance(rval, collections.Iterable)。所以......

def wrap_in_iterable(x): 
    if isinstance(x, collections.Iterable): 
     return x 
    else: 
     return [x] 

另外,也許你想要一個列表,而不僅僅是一個迭代;得到類似列表的東西,但消除了類似發電機和字典的東西,collections.Sequence很方便。因爲collections.Sequencecollection.Iterable定義__subclasshook__ s表示執行相應hasattr檢查(不要無限發電機傳遞給這個函數。)

def convert_to_sequence(x): 
    if isinstance(x, collections.Sequence): 
     return x 
    elif isinstance(x, collections.Iterable): 
     return list(x) 
    else 
     return [x] 

這些工作。

最後,冒着無聊的風險 - 如果您對返回函數有控制權,只要可能就返回一個項目列表。