Python遍历嵌套列表但仅限于偶数索引

4
我有一个嵌套列表,例如: 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)

我不知道是将列表展平,然后只遍历单个列表(但这会破坏嵌套列表的目的),还是有一种方法可以检查每个子列表的第一个索引。

请问有人可以告诉我如何做到这一点吗?

谢谢!


你能给出一个预期的输出吗? - nassim
欢迎来到 Stack Overflow!在您的列表中,请确保在项目之间添加逗号。它应该是 L = [[A,200],[B,300],[C,500],[A,300]]。 - Joshua Hall
6个回答

3

您可以使用集合来跟踪在迭代子列表时已经“看到”的字母:

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

0

我建议使用pandas,将您的列表转换为数据框,这将允许您指定要处理的列,并允许您在列表上定义多个操作。

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")


0
你可以使用 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]

请注意,每个键还分配了一个数字列表,以便您可以跟踪与字母相关联的数字。

0

您可以直接使用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))

0

你可以通过索引直接访问列表中的元素。如果 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])`

当然,这可以进行优化,仅检查一半的索引。

0

您可以将这些项与一组项进行比较,以查看是否存在重复。但是,这不会返回重复的字母。

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))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接