我有一个类似这样的嵌套列表:
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)
我不知道是否要展平列表,然后仅遍历单个列表(但这会打乱嵌套列表的目的),或者是否有办法检查每个子列表的第一个索引。 谁能告诉我该怎么做?
谢谢!
答案 0 :(得分:3)
您可以使用一个集合来跟踪遍历子列表时已经“看到”的字母:
def has_duplicates(L):
seen = set()
for letter, _ in L:
if letter in seen:
return True
seen.add(letter)
return False
答案 1 :(得分: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")
答案 2 :(得分:0)
您可以使用std::allocator
或set
来记录元素,并检查是否早先找到了元素:
dict
请注意,还为每个键分配了一个数字列表,以便您可以跟踪与字母关联的数字。
答案 3 :(得分: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))
答案 4 :(得分: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])`
当然,可以对其进行优化以仅检查一半索引。
答案 5 :(得分: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))