python 列表问题 ?

懒洋洋
  • 9

新手勿喷

for i in  open (v):
    _temp = i.split('-')
    self._i= gen.gen(_temp[0], _temp[1])

self._i 中是多个列表[] [] [] 怎样合并成一个


cc = []
for i in  open (v):
    _temp = i.split('-')
    self= gen.gen(_temp[0], _temp[1])
    for bbc in  self:
        cc.append(i)

这样解决的 !!!

怎样把结果赋值给 self._i

 self._i = cc
    print 出来是空白 
回复
阅读 1.9k
4 个回答

如果你的意思是要合併多個 list 為一個,那使用 itertools.chain 來串接是最好的,以下是個簡單的範例:

>>> from itertools import chain
>>> a = [1,2,3]
>>> b = [4,5,6]
>>> c = [7,8,9]
>>> chain(a,b,c)
<itertools.chain object at 0x7f2915465c10>
>>> list(chain(a,b,c))
[1, 2, 3, 4, 5, 6, 7, 8, 9]

對於你的 case 而言:

from itertools import chain
lst = list(chain(*self._i))

以下題外話。

@松林 的方法是可行的,而且效能不會差,在 python 中 擴增(增強)運算一般運算 的行為不見得完全一模一樣,在這裡我們使用 + 來討論。

我們看一個例子:

>>> lst1 = [1,2,3]
>>> lst2 = [4,5,6]
>>> id(lst1)
139814427362656
>>> id(lst1 + lst2)
139814427363088
>>> lst1 += lst2
>>> id(lst1)
139814427362656

由本例可以發現,lst1 + lst2 會產生一個新的 list,但是 lst1 += lst2 則不會,因為對於擴增運算,Python 大部分 會依循以下規則:

  1. 不可變的型態會經由運算後產生一個新的 object,並且讓變數參考到該 object

  2. 可變的型態會採用 就地(in-place)運算 的方式來擴充或更新變數原本參考的 object

也就是說 lst1 += lst2 等價於 lst1.extend(lst2)

這取決於該型態是否有實作 __iadd__(或 __imul__ ...) 而不是只有實作 __add__ (或 __mul__ ...)

對於沒有實作 __iXXX__ 的型態,Python 會改呼叫 __XXX__ 代替,這一定會運算出新的 object,但是 __iXXX__ 則會就地更新原 object

也就是說 大部分 的:

  1. 不可變型態都不會實作 __iXXX__,因為更新不可變型態的 object 是沒有道理的

  2. 可變型態會實作 __iXXX__ 來就地更新

為什麼我一直強調大部分呢?

因為 CPython 中優化了 str 的擴增運算,str += other 實在太常用了,在串接時,Python 並不會每次都複製字串


我回答過的問題: Python-QA

使用extend函数,比如:

>>> a=[1,2,3]
>>> b=[4,5,6]
>>> c=[7,8,9]
>>> d=[]
>>> d.extend([a,b,c])
>>> d
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

使用相加会直观一点,不过性能会差一点

ret = []
for x in self._i:
    ret += x
print(x)

这样是不是更加Pythonic?

myList = [x for j in self._i for x in j]
宣传栏