最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python?列表和字典常踩坑即解決方案

 更新時間:2022年05月18日 17:09:00   作者:??北江愛國????  
這篇文章介紹了?Python?列表和字典常踩坑即解決方案,主要針對python列表和字典得一些問題,提出了多種解決方案。需要的小伙伴可以參考一下

前言:

在Python中,如果我們想要在遍歷一組數據的過程中,對這組數據進行修改,通常會出現(xiàn)許多問題,例如對列表進行上述操作時, 會忽略部分數據;遍歷字典時,不能修改數據。本文針對這些問題,提出了多種解決方案。

一、關于列表

1.問題描述

在Python中,如果你試圖在遍歷一組數據的過程中,對其進行修改,這通常沒什么問題。

例如:

l?=?[3,?4,?56,?7,?10,?9,?6,?5]

for?i?in?l:
????if?not?i?%?2?==?0:
????????continue
????l.remove(i)
print(l)

上述這段代碼遍歷了一個包含數字的列表,為了去除掉所有偶數,直接修改了列表l。

然而,運行后輸出卻是:

[3, 56, 7, 9, 5]

等一下!輸出似乎不對。最終的結果仍然含有一個偶數56。為什么沒有成功去除這個數呢?我們可以嘗試打印出 for循環(huán)遍歷的所有元素,

運行如下代碼:

l?=?[3,?4,?56,?7,?10,?9,?6,?5]
for?i?in?l:
????print(i)
????if?not?i?%?2?==?0:
????????continue
????l.remove(i)
print(l)

這段代碼的輸出為:

3
4
7
10
6
[3, 56, 7, 9, 5]

從輸出可以看出,for循環(huán)似乎沒有訪問列表中的所有元素。為了解for循環(huán)在內部究竟做了什么, 我們可以使用 iter 和 next 來模擬一下。

看看下面這個例子,我使用了ipython shell 來運行代碼:

In?[1]:?l?=?[3,?4,?56,?7,?10,?9,?6,?5]
In?[2]:?#?把列表變成一個迭代器
In?[3]:?it?=?iter(l)
In?[4]:?#?使用?next()?方法來模擬?for循環(huán)
In?[5]:?next(it)
Out[5]:?3
In?[6]:?next(it)
Out[6]:?4
In?[7]:?#?移除一個迭代器已經訪問過的元素
In?[8]:?l.remove(3)
In?[9]:?next(it)
Out[9]:?7
In?[10]:?#?注意此處跳過了56,我們可以再移除一個元素
In?[11]:?l.remove(4)
In?[12]:?next(it)
Out[12]:?9

上面這個實驗揭示了:當你移除一個迭代器已經訪問過的元素后,在下一次迭代時,會跳過右邊的一個元素,直接訪問下一個。

反之依然成立,即當開始迭代后,如果你在列表開頭添加了一個元素,下次迭代時,可能會訪問到已經迭代過的元素,

下面這段代碼就出現(xiàn)了這種情況:

In[1]:?l?=?[3,?4,?56,?7,?10,?9,?6,?5]
In[2]:?it?=?iter(l)
In[3]:?next(it)
Out[3]:?3
In[4]:?next(it)
Out[4]:?4
In[5]:?l.insert(0,?44)
In[6]:?next(it)
Out[6]:?4

注意:當在列表頭部添加了44后,4被訪問了兩次。

2.解決方案

為了解決上述問題,我們必須得確保:不能移除迭代器訪問過的元素。

方案一

我們可以先對原列表進行翻轉得到一個新列表,再對新列表進行迭代,并在原列表 l 中移除不符合條件的元素。

該方案代碼如下:

l?=?[3,?4,?56,?7,?10,?9,?6,?5]
#?迭代翻轉后的列表
for?i?in?reversed(l):
????print(i)
????if?not?i?%?2?==?0:
????????continue
????l.remove(i)
print(l)

結果如下:

5
6
9
10
7
56
4
3
[3, 7, 9, 5]

注意:迭代器現(xiàn)在成功訪問到了列表中的所有元素,并最終輸出了只含有奇數的列表。

方案二

我們還可以在開始迭代前,先復制列表 l 。但是當列表 l 中的數據過多時,這樣做顯然比較耗費性能。

該方案代碼如下:

l?=?[3,?4,?56,?7,?10,?9,?6,?5]
#?在這里使用?'l.copy()'?來對列表?l?進行淺拷貝
for?i?in?l.copy():??
????print(i)???
????if?not?i?%?2?==?0:?????
????????continue??
????l.remove(i)
print(l)

輸出如下:

3
4
56
7
10
9
6
5
[3, 7, 9, 5]

該方案能保證迭代的順序和移除元素的順序相同。不過由于迭代和移除這兩種操作針對的是兩個不同的列表,因此順序相同并不重要。

二、關于字典

1.問題描述

在對字典進行迭代時,不能修改字典。如下:

#?{0:?0,?1:?1,?2:?2,?3:?3,?4:?4,?5:?5,?6:?6,?7:?7,?8:?8,?9:?9}
d?=?{k:?k?for?k?in?range(10)}
for?k,?v?in?d.items():??
????if?not?v?%?2?==?0:????
????????continue??
????d.pop(k)

這段代碼會產生 RuntimeError :

Traceback?(most?recent?call?last):??
??File?"F:/Documents/pythonprojects/01practice/app.py",?line?7,?in?<module>??
????for?k,?v?in?d.items():
RuntimeError:?dictionary?changed?size?during?iteration

2.解決方案

我們可以先復制字典的所有 key ,隨后在迭代 key 的過程中,移除不符合條件的元素。過程如下:

#?{0:?0,?1:?1,?2:?2,?3:?3,?4:?4,?5:?5,?6:?6,?7:?7,?8:?8,?9:?9}
d?=?{k:?k?for?k?in?range(10)}
#?這里復制了字典中的所有key值
#?沒有復制整個字典
#?同時使用tuple()速度更快
for?k?in?tuple(d.keys()):???
????if?not?d[k]?%?2?==?0:????
????????continue??
????d.pop(k)
????
print(d)

運行代碼后輸出如下:

{1: 1, 3: 3, 5: 5, 7: 7, 9: 9}

我們成功移除了字典中的所有偶數鍵值對!

結論

文中我們針對迭代一組數據時無法進行修改的問題,分別提出了不同的解決方案:如果想在遍歷列表的時候,對列表進行修改, 我們可以先對原列表進行翻轉或復制,從而得到一個新列表,隨后在遍歷新列表的過程中,修改原列表中的數據;如果我們想在遍歷字典的時候,對字典進行修改,可以先復制字典的所有鍵值,然后在迭代鍵值的時候,修改字典中的數據。

到此這篇關于 Python 列表和字典常踩坑即解決方案的文章就介紹到這了,更多相關 Python 列表和字典 內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • python網絡編程學習筆記(二):socket建立網絡客戶端

    python網絡編程學習筆記(二):socket建立網絡客戶端

    看了這一節(jié),突然之間對python網絡編程學習筆記(1)中的一些不理解的問題有了認識,至少明白了socket是怎么回事。這里關于socket的起源等問題就不做筆記記錄了,直接進入主題
    2014-06-06
  • Python中用Ctrl+C終止多線程程序的問題解決

    Python中用Ctrl+C終止多線程程序的問題解決

    花了一天時間用python為服務寫了個壓力測試。很簡單,多線程向服務器發(fā)請求。但寫完之后發(fā)現(xiàn)如果中途想停下來,按Ctrl+C達不到效果,自然想到要用信號處理函數捕捉信號,使線程都停下來,問題解決的方法請往下看:
    2013-03-03
  • Python matplotlib繪制實時數據動畫

    Python matplotlib繪制實時數據動畫

    Matplotlib作為Python的2D繪圖庫,它以各種硬拷貝格式和跨平臺的交互式環(huán)境生成出版質量級別的圖形。本文將利用Matplotlib庫繪制實時數據動畫,感興趣的可以了解一下
    2022-03-03
  • Python類的用法實例淺析

    Python類的用法實例淺析

    這篇文章主要介紹了Python類的用法,以實例形式簡單分析了Python中類的定義、構造函數及使用技巧,需要的朋友可以參考下
    2015-05-05
  • Python面向對象之多態(tài)原理與用法案例分析

    Python面向對象之多態(tài)原理與用法案例分析

    這篇文章主要介紹了Python面向對象之多態(tài)原理與用法,結合具體案例形式分析了Python多態(tài)的具體功能、原理、使用方法與操作注意事項,需要的朋友可以參考下
    2019-12-12
  • 基于OpenCV的攝像頭測距的實現(xiàn)示例

    基于OpenCV的攝像頭測距的實現(xiàn)示例

    本文主要介紹了基于OpenCV的攝像頭測距的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Python中的pandas表格模塊、文件模塊和數據庫模塊

    Python中的pandas表格模塊、文件模塊和數據庫模塊

    這篇文章介紹了Python中的pandas表格模塊、文件模塊和數據庫模塊,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • 利用?Python?開發(fā)一個?Python?解釋器

    利用?Python?開發(fā)一個?Python?解釋器

    這篇文章主要介紹了利用?Python?開發(fā)一個?Python?解釋器,在本文中,我們將設計一個可以執(zhí)行算術運算的解釋器。下面我們大家一起來看看吧</P><P>
    2022-01-01
  • Python 處理表格進行成績排序的操作代碼

    Python 處理表格進行成績排序的操作代碼

    這篇文章主要介紹了Python 處理表格進行成績排序,也就是說將學生從按照學號排序變?yōu)榘凑粘煽儚母叩降瓦M行排序,具體實現(xiàn)代碼跟隨小編一起看看吧
    2021-07-07
  • Python時間序列缺失值的處理方法(日期缺失填充)

    Python時間序列缺失值的處理方法(日期缺失填充)

    這篇文章主要給大家介紹了關于Python時間序列缺失值(日期缺失填充)的處理方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Python具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-08-08

最新評論

于都县| 曲周县| 凤翔县| 安龙县| 博乐市| 石嘴山市| 芦溪县| 天台县| 甘泉县| 广南县| 蒙城县| 丹阳市| 自贡市| 冷水江市| 安平县| 海宁市| 弋阳县| 清远市| 定西市| 南投县| 永年县| 上虞市| 平舆县| 鄄城县| 商洛市| 南川市| 鹤庆县| 平度市| 诏安县| 花莲县| 观塘区| 锦屏县| 江源县| 扬中市| 比如县| 郓城县| 渭源县| 长治市| 郸城县| 通江县| 疏勒县|