Python Итерация по вложенному списку, но только по четным индексам - PullRequest
4 голосов
/ 11 апреля 2020

У меня есть такой вложенный список, например: 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)

Я не знал, нужно ли сгладить список, а затем просто выполнить итерацию по одному списку (но это бы разрушило цель вложенного список) или, если есть способ проверить первый индекс каждого подсписка. Кто-нибудь может дать мне знать, как я могу это сделать?

Спасибо!

Ответы [ 6 ]

3 голосов
/ 11 апреля 2020

Вы можете использовать набор для отслеживания букв, которые были «видны» при переборе подсписков:

def has_duplicates(L):
    seen = set()
    for letter, _ in L:
        if letter in seen:
            return True
        seen.add(letter)
    return False
0 голосов
/ 11 апреля 2020

Вы можете сравнить предметы с набором предметов, чтобы увидеть, есть ли повторы. Это не вернет буквы, которые повторяются, хотя.

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))
0 голосов
/ 11 апреля 2020

Вы можете получить доступ к элементам списка напрямую по индексу. Если 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 голосов
/ 11 апреля 2020

Вы можете использовать Счетчик напрямую, чтобы найти дубликаты:

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 голосов
/ 11 апреля 2020

Вы можете использовать set или dict, чтобы вести учет элементов и проверять, был ли элемент уже найден ранее:

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 голосов
/ 11 апреля 2020

Я предлагаю использовать pandas, преобразовать ваш список в фрейм данных, это позволит вам указать ie, с каким столбцом вы работаете, и позволит вам определить несколько операций в вашем списке.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...