亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

隨著人工智能的發(fā)展,Python變得越來(lái)越流行了。而Python語(yǔ)言中列表(List)與其他語(yǔ)言的數(shù)組(Array)類似,是一種有序的集合數(shù)據(jù)結(jié)構(gòu),但Python List可支持各種數(shù)據(jù)類型,長(zhǎng)度也可動(dòng)態(tài)調(diào)整,與JS中的數(shù)組或JAVA ArrayList很接近。在實(shí)際編程中,我們會(huì)遇到數(shù)組或列表去掉重復(fù)項(xiàng)的需求。那么在Python編程中,我們會(huì)有很多種方法來(lái)實(shí)現(xiàn)這個(gè)目標(biāo),有的新建列表來(lái)存儲(chǔ)非重復(fù)項(xiàng),有的則在原有基礎(chǔ)上刪除掉重復(fù)的項(xiàng),有的則利用數(shù)據(jù)結(jié)構(gòu)來(lái)達(dá)到去重復(fù)的目的。具體哪一種方法更好呢?只能說(shuō)根據(jù)不同場(chǎng)景來(lái)選擇一種,以下的N種方式將有助于對(duì)于基礎(chǔ)算法和語(yǔ)言學(xué)習(xí)的理解。

Python列表去重復(fù)項(xiàng)的N種方法

 

方式

## 1. 新建列表,如果新列表中不存在,則添加到新列表
def unique(data):
    newList = []
    for item in data:
        if item not in newList:
            newList.Append(item)
    print("for list + not in. data:", newList)

# test
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1]
start_time = time.time()
unique(data)
print("time:" + str((time.time() - start_time) * 1000) + " ms")

# result
$ python -V
Python 2.7.16
$ python unique.py 
('for list + not in. data:', ['a', 1, 2, 'b'])
time:0.0441074371338 ms
## 2. 新建列表。根據(jù)下標(biāo)判斷是否存在新列表中,如果新列表中不存在則添加到新列表
def unique(data):
    newList = []
    for i in range(len(data)):
        if data[i] not in newList:
            newList.append(data[i])
    return newList

# test
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1]
start_time = time.time()
print("for range + not in. data:", unique(data))
print("time:" + str((time.time() - start_time) * 1000) + " ms")
## 3. 通過(guò)index找不到該項(xiàng),則追加到新列表中。index找不到會(huì)報(bào)錯(cuò),因此放在異常處理里
def unique(data):
    newList = []
    for i in range(len(data)):
        item = data[i]
        try:
            if (newList.index(item) < 0):
                print('newList:', newList)
        except ValueError:
            newList.append(item)
    return newList

# test
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1]
start_time = time.time()
print("list index + except:", unique(data))
print("time:" + str((time.time() - start_time) * 1000) + " ms")
## 4. 新建列表,兩個(gè)循環(huán)。如果內(nèi)循環(huán)與外循環(huán)項(xiàng)相同,且下標(biāo)相同就添加到新列表,其余忽略
def unique(data):
    newList = []
    for i in range(len(data)):
        j = 0
        while j < i:
            j += 1
            if data[i] == data[j]:
                if (i == j):
                    newList.append(data[i])
                break
    return newList

# test
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1]
start_time = time.time()
print("new list + for. newList:", unique(data))
print("time:" + str((time.time() - start_time) * 1000) + " ms")
## 5. 在原有列表上移除重復(fù)項(xiàng)目。自后往前遍歷,逐個(gè)與前面項(xiàng)比較,如果值相同且下標(biāo)相同,則移除當(dāng)前項(xiàng)。
def unique(data):
    l = len(data)
    while (l > 0):
        l -= 1
        i = l
        while i > 0:
            i -= 1
            if data[i] == data[l]:
                del data[l]
                break
    return data

# test
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1]
start_time = time.time()
print("one list while. last -> first result. data:", unique(data))
print("time:" + str((time.time() - start_time) * 1000) + " ms")
## 6. 在原有列表上移除重復(fù)項(xiàng)目。自前往后遍歷,逐個(gè)與后面項(xiàng)比較,如果值相同且下標(biāo)相同,則移除當(dāng)前項(xiàng)。
def unique(data):
    l = len(data)
    i = 0
    while i < l:
        j = i + 1
        while j < l:
            if data[i] == data[j]:
                del data[j]
                l -= 1
                i -= 1
                break
            j += 1
        i += 1
    return data

# test
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1]
start_time = time.time()
print("one list while. first -> last result. data:", unique(data))
print("time:" + str((time.time() - start_time) * 1000) + " ms")
## 7. 新建列表。遍歷列表,利用index比較出現(xiàn)的位置,如果出現(xiàn)在第一次的位置則追加到新數(shù)組
def unique(data):
    newList = []
    for i in range(len(data)):
        if i == data.index(data[i]):
            newList.append(data[i])
    return newList

# test
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1]
start_time = time.time()
print("for range + index. data:", unique(data))
print("time:" + str((time.time() - start_time) * 1000) + " ms")
## 8. 利用字典屬性唯一性來(lái)實(shí)現(xiàn)去重復(fù)。
def unique(data):
    obj = {}
    for item in data:
        obj[item] = item
    return obj.values()

# test
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1]
start_time = time.time()
print("list + dict:", unique(data))
print("time:" + str((time.time() - start_time) * 1000) + " ms")
## 9. 利用filter函數(shù),即把不符合條件的過(guò)濾掉。這里filter不支持下標(biāo),因此需要借助外部列表存儲(chǔ)不重復(fù)項(xiàng)
def uniq(item):
    i = data.index(item)
    if (item not in newList):
        newList.append(item)
        return True
    return False


# test
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1]
start_time = time.time()
newList = []
print('filter + list + not in: ', filter(uniq, data))
print("time:" + str((time.time() - start_time) * 1000) + " ms")
## 10. 利用字典結(jié)合過(guò)濾來(lái)實(shí)現(xiàn)去重復(fù)。
def unique(item):
    if obj.get(item) == None:
        obj[item] = item
        return True
    return False

# test
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1]
start_time = time.time()
obj = {}
print("filter + dict + get:", filter(unique, data))
print("time:" + str((time.time() - start_time) * 1000) + " ms")
## 11. 利用map來(lái)實(shí)現(xiàn)去重復(fù)。與map與filter類似,是一個(gè)高階函數(shù)。可以針對(duì)其中項(xiàng)逐個(gè)修改操作。
## 與filter不同map會(huì)保留原有項(xiàng)目,并不會(huì)刪除,因此值可以改為None,然后再過(guò)濾掉。
def unique(item):
    if item not in newList:
        newList.append(item)
        return item
    return None


# test
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1]
newList = []
start_time = time.time()

print("list from Map:", filter(lambda item: item != None, map(unique, data)))
print("time:" + str((time.time() - start_time) * 1000) + " ms")
## 12. 利用set數(shù)據(jù)結(jié)構(gòu)里key的唯一性來(lái)去重復(fù)
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1]
print("from Set:", set(data))
print("time:" + str((time.time() - start_time) * 1000) + " ms")
## 13. 提前排序,從后向前遍歷,將當(dāng)前項(xiàng)與前一項(xiàng)對(duì)比,如果重復(fù)則移除當(dāng)前項(xiàng)
def unique(data):
    data.sort()
    l = len(data)
    while (l > 0):
        l -= 1
        if (data[l] == data[l - 1]):
            data.remove(data[l])
    return data

# test
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1]
start_time = time.time()
print("sort + remove:", unique(data))
print("time:" + str((time.time() - start_time) * 1000) + " ms")
## 14. 提前排序,自前往后遍歷,將當(dāng)前項(xiàng)與后一項(xiàng)對(duì)比,如果重復(fù)則移除當(dāng)前項(xiàng)
def unique(data):
    """
     in python 3: TypeError: '<' not supported between instances of 'int' and 'str'
     need to keep the same Type of member in List
    """
    data.sort()
    l = len(data) - 1
    i = 0
    while i < l:
        if (data[i] == data[i + 1]):
            del data[i]
            i -= 1
            l -= 1
        i += 1
    return data

# test
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1]
start_time = time.time()
print("sort+del ASE:", unique(data))
print("time:" + str((time.time() - start_time) * 1000) + " ms")
## 15. 利用reduce函數(shù)來(lái)去重復(fù)。reduce具有累計(jì)的作用,判斷如果不在累計(jì)結(jié)果中出現(xiàn),則追加到結(jié)果中。
import functools
def unique(data):
    newList = []

    def foo(result, item):
        if isinstance(result, list) == False:
            result = [result]
        return result if item in result else result + [item]

    return functools.reduce(foo, data)

# test
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1]
start_time = time.time()
print("functools.reduce:", unique(data))
print("time:" + str((time.time() - start_time) * 1000) + " ms")
## 16. 利用遞歸調(diào)用來(lái)去重復(fù)。遞歸自后往前逐個(gè)調(diào)用,當(dāng)長(zhǎng)度為1時(shí)終止。
## 當(dāng)后一項(xiàng)與前任一項(xiàng)相同說(shuō)明有重復(fù),則刪除當(dāng)前項(xiàng)。相當(dāng)于利用自我調(diào)用來(lái)替換循環(huán)
def recursionUnique(data, len):
    if (len <= 1):
        return data

    l = len
    last = l - 1
    isRepeat = False

    while (l > 1):
        l -= 1
        if (data[last] == data[l - 1]):
            isRepeat = True
            break

    if (isRepeat):
        del data[last]

    return recursionUnique(data, len - 1)

# test
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1]
start_time = time.time()
print("recursionUnique:", recursionUnique(data, len(data)))
print("time:" + str((time.time() - start_time) * 1000) + " ms")
## 17. 利用遞歸調(diào)用來(lái)去重復(fù)的另外一種方式。遞歸自后往前逐個(gè)調(diào)用,當(dāng)長(zhǎng)度為1時(shí)終止。
## 與上一個(gè)遞歸不同,這里將不重復(fù)的項(xiàng)目作為結(jié)果拼接起來(lái)
def recursionUniqueNew(data, len):
    if (len <= 1):
        return data

    l = len
    last = l - 1
    isRepeat = False
    while (l > 1):
        l -= 1
        if (data[last] == data[l - 1]):
            isRepeat = True
            break

    if (isRepeat):
        del data[last:]
        result = []
    else:
        result = [data[last]]

    return recursionUniqueNew(data, len - 1) + result

# test
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1]
start_time = time.time()
print("recursionUniqueNew:", recursionUniqueNew(data, len(data)))
print("time:" + str((time.time() - start_time) * 1000) + " ms")
Python列表去重復(fù)項(xiàng)的N種方法

 

討論

從以上例子上可以看出,相對(duì)來(lái)講,Python比起其它語(yǔ)言要靈活得多,與JS并列最流行的腳本類語(yǔ)言,這也就是為何Python如此流行的原因吧。

哪一種方式更適合呢?你常用那種方式來(lái)實(shí)現(xiàn)去重復(fù)項(xiàng)?新建數(shù)組、非新建、借助DIct或Set等結(jié)構(gòu),亦或是其它方式?

Python列表去重復(fù)項(xiàng)的N種方法

 

分享到:
標(biāo)簽:列表 Python
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定