簡體   English   中英

Python 遍歷嵌套列表,但只有偶數索引

[英]Python Iterate through a nested list but only the even indexes

我有一個這樣的嵌套列表,例如: L = [[A,200][B,300][C,500][A,300]]我想知道是否只有字母重復而不是數字。 我試過了,但這也會告訴我數字是否重復。

def find_duplicates(L):
    for list in L:
        for number in list:
            print(max(Counter(sum(L, [])).values()) > 1)

我不知道是否要展平列表,然后只遍歷單個列表(但這會破壞嵌套列表的目的),或者是否有辦法檢查每個子列表的第一個索引。 誰能讓我知道我該怎么做?

謝謝!

您可以使用 set 來跟蹤在遍歷子列表時“看到”的字母:

def has_duplicates(L):
    seen = set()
    for letter, _ in L:
        if letter in seen:
            return True
        seen.add(letter)
    return False

我建議使用 pandas,將您的列表轉換為 dataframe 它將允許您指定您使用的列,並允許您在列表中定義多個操作。

import pandas as pd

L = [['A',200],['B',300],['C',500],['A',300]]
df = pd.DataFrame(L,columns=['letters','numbers'])

has_dup = df['letters'].duplicated().any()

if has_dup : 
  print("L has duplicate letters")

您可以使用setdict來記錄元素,並檢查之前是否已經找到了元素:

L = [['A',200], ['B',300], ['C',500], ['A',300]]
existing_set = dict()
for letter, number in L:
    if letter in existing_set:
        print(letter, 'is a duplicate')
        existing_set[letter].append(letter)
    else:
        existing_set[letter] =[letter]

請注意,還為每個鍵分配了一個數字列表,因此您可以跟蹤與字母關聯的數字。

您可以直接使用 Counter 來查找重復項:

L = [["A",200],["B",300],["C",500],["A",300]]

from collections import Counter
letterCounts     = Counter(c for c,_ in L)
duplicateLetters = list(letterCounts-Counter(letterCounts.keys()))

print(duplicateLetters) # ['A']

如果你只需要知道是否有重復,你可以使用一個集合:

def anyDuplicates(L):
    return len(L) != len(set(c for c,_ in L))

您可以通過索引直接訪問列表的元素。 如果 L = [A,200],則 L[0] = 'A'。

'def find_duplicates(L):
    duplicates = []
    for i in range(len(L)):
        #fix a letter to compare
        candidate_letter = L[i]
        for j in range(len(L)):
            if i == j:
                continue
            elif candidate_letter == L[j]:
                duplicates.append(L[j])`

當然,這可以優化為只檢查一半的索引。

您可以將這些項目與一組項目進行比較,以查看是否有重復。 這不會返回重復的字母。

L = [["A", 200], ["B", 300], ["C", 500], ["D", 300]]  # lists need to have commas in between items


def has_duplicates(sequence):
    first_j = [i[0] for i in sequence]  # creates a list of only the first indexes
    if list(set(first_j)) == first_j:  # set removes duplicates
        return False
    else:
        return True


print(has_duplicates(L))

暫無
暫無

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

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