簡體   English   中英

Python,遍歷列表列表並更改原始列表

[英]Python, iterate over list of lists and change the original ones

我有一個不同長度的列表,其中包含一些字符串。

list_01 = ['ba', '4', 'cdf']
list_02 = ['a4a', '56', 'scdf']
...
list_N = ['baaa', 'dgg', '12f']

並且我需要將包含多個字符的字符串拆分為單個字符串,以便得到類似的結果:

list_01 = ['b', 'a', '4', 'c', 'd', 'f']
list_02 = ['a', '4', 'a', '5' '6', 's', 'c','d', 'f']
...
list_N = ['b', 'a', 'a', 'a', 'd', 'g', 'g', '1', '2', 'f']

現在,我嘗試了這段代碼:

    for lst in [list_1, list_2, ... list_N]:
        tmp = []
        for x in lst:
            if len(x)>1:
                tmp.append([char for char in x])
            else:
                tmp.append(x)
        lst = [item for sublist in tmp for item in sublist]

這在循環內有效,即 lst 的每個實例實際上都是我想要的,但更改不會轉移到 list_01...list_N。

我假設代碼中的某個點 lst 不再是對 for 循環中當前項的引用,但它完全變成了一個新對象......可能在這里?

lst = [item for sublist in tmp for item in sublist]

我檢查了這個討論,並且那里提到的創建列表的不同副本的方法似乎沒有包含我在代碼中所做的任何事情。 我怎樣才能解決這個問題?

您對正在創建的新對象是正確的。 如果你想保持相同的列表對象,你可以使用 clear 和 extend。:

list_01 = ['ba', '4', 'cdf']
list_02 = ['a4a', '56', 'scdf']
list_N = ['baaa', 'dgg', '12f']

for lst in [list_01, list_02, list_N]:
    tmp = []
    for x in lst:
        if len(x)>1:
            tmp.append([char for char in x])
        else:
            tmp.append(x)
    lst.clear()
    lst.extend([item for sublist in tmp for item in sublist])

for lst in [list_01, list_02, list_N]:
    print(lst)

這里有一個簡單的方法。 要分解列表,您可以join並轉換為list 要覆蓋,您可以使用切片:

list_01 = ['ba', '4', 'cdf']
list_02 = ['a4a', '56', 'scdf']
list_N = ['baaa', 'dgg', '12f']

lists = [list_01, list_02, list_N]

for l in lists:
    l[:] = list(''.join(l))
lists

輸出:

>>> lists
[['b', 'a', '4', 'c', 'd', 'f'],
 ['a', '4', 'a', '5', '6', 's', 'c', 'd', 'f'],
 ['b', 'a', 'a', 'a', 'd', 'g', 'g', '1', '2', 'f']]

>>> list_01
['b', 'a', '4', 'c', 'd', 'f']

有多種方法可以解決問題。

但要記住的重要一點是,我們可以嘗試操作列表的內容,而不是重新分配列表的值。

這意味着,可以完成所有列表操作,如 clear()、join()、append()、extend()、列表切片等,並且更改將反映在原始列表中。

如果我們嘗試將新列表重新分配為值,它將不會反映在原始列表中。 示例類似於您在代碼中嘗試的示例。 那就是為列表分配一個新值。

嘗試這個:

from copy import deepcopy

list_01 = ['ba', '4', 'cdf']
list_02 = ['a4a', '56', 'scdf']
list_N = ['baaa', 'dgg', '12f']

for lst in [list_01, list_02, list_N]:
    tmp = deepcopy(lst)
    lst.clear()
    lst.extend([letter for word in tmp for letter in word])

for lst in [list_01, list_02, list_N]:
    print(lst)

將結果分配給lst[:]會做你想做的。

我使用了不同的方法來構建目標。 首先,我們將所有字符串連接到一個列表中以使用''.join(lst)獲得一個長字符串。 然后我們通過調用list將該字符串拆分為單個字符。

list_01 = ['ba', '4', 'cdf']
list_02 = ['a4a', '56', 'scdf']
list_N = ['baaa', 'dgg', '12f']

for lst in [list_01, list_02, list_N]:
    lst[:] = list(''.join(lst))

print(list_N)

對於list_N您將獲得輸出:

['b', 'a', 'a', 'a', 'd', 'g', 'g', '1', '2', 'f']

如果列表量很大,請使用 Map 函數來降低時間復雜度:

list_01 = ['ba', '4', 'cdf']
list_02 = ['a4a', '56', 'scdf']
list_N = ['baaa', 'dgg', '12f']

for list_ in [list_01, list_02,list_N]:
  temp = []
  for item in list_:
    temp = temp + list(map(lambda x: x, item))
  print(temp)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM