我有一些代碼可能會返回一個單一的int或列表。當它返回一個int時,我需要將它轉換爲只包含int的列表。如何將int轉換爲列表?
我嘗試以下,但它不工作:
newValue = list(retValue)
顯然,我不能這樣做,因爲list(some int)
整數不是迭代。有沒有另外一種方法呢?
在此先感謝!
我有一些代碼可能會返回一個單一的int或列表。當它返回一個int時,我需要將它轉換爲只包含int的列表。如何將int轉換爲列表?
我嘗試以下,但它不工作:
newValue = list(retValue)
顯然,我不能這樣做,因爲list(some int)
整數不是迭代。有沒有另外一種方法呢?
在此先感謝!
定義自己的功能:
def mylist(x):
if isinstance(x,(list,tuple)):
return x
else:
return [x]
>>> mylist(5)
[5]
>>> mylist([10])
[10]
鑄造[x]的問題是,如果x已經是一個列表,這將使它成爲一個嵌套列表,這是不希望的。任何方式來避免這種情況? – turtlesoup 2012-07-10 21:46:00
@Jimster – 2012-07-10 21:48:55
'如果不是isinstance(x,(tuple,list)):return [x]'...也許 – 2012-07-10 21:49:19
if isinstance(x,list): return x
else: return [x]
就是這樣。
當然,這不會對其他迭代類型進行智能處理,但並不清楚你是否想將所有迭代對象看作是列表(也許你會,也許你不會)。
在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 ...「如果它看起來像一隻鴨子,鴨子像鴨子一樣,它肯定是一隻鴨子。」 – RobB 2012-07-10 22:05:21
用於鴨子打字的+1。 – 2012-07-10 23:11:10
用於鴨子打字的+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
嘗試將變量轉換爲int。如果它已經是一個int,這是一個無操作。如果它是一個列表,則會引發TypeError。
try:
return [int(x)]
except TypeError:
return x
儘管如果異常情況發生的概率很高,但通常會使用異常來控制流量。這是因爲處理異常是一項相當長的任務。
另一種方法是使用isinstance
運算符。
if isinstance(x, list):
return x
else:
return [x]
listInt = intVal if isinstance(intVal,list) else [intVal]
這將始終返回一個列表,如果值不是一個列表。 希望這有助於
+1。 Python三元組使用不足... – dawg 2012-07-11 01:55:26
這真的只是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.Sequence
和collection.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]
這些工作。
最後,冒着無聊的風險 - 如果您對返回函數有控制權,只要可能就返回一個項目列表。
「我有一些代碼可能會返回一個int或列表。「**爲什麼它以這種方式行事**?它是你的代碼嗎?爲什麼不把它調整爲總是返回相同類型的東西呢?它有一個很好的理由說明它爲什麼返回一個int(而不是一個帶有1個int的列表) ),或者沒有... – 2012-07-10 23:00:25