Dada

a = [('AB', 11), ('CD', 12), ('EF', 13), ('GG', 1332)]

Y

b = [('AB', 411), ('XX', 132), ('EF', 113), ('AF', 113), ('FF', 113)]

Si n = 3, solo quiero considerar los 3 elementos principales en cada lista y devolver las tuplas que tienen el mismo primer elemento (la cadena).

Por ejemplo, quiero devolver ['AB','EF'] en este caso.

¿Cómo puedo hacer esto?

0
Dawn17 25 feb. 2018 a las 23:01

4 respuestas

La mejor respuesta

Puede usar Counter para esto como:

Código:

a = [('AB', 11), ('CD', 12), ('EF', 13), ('GG', 1332)]
b = [('AB', 411), ('XX', 132), ('EF', 113), ('AF', 113), ('FF', 113)]

from collections import Counter
counts = Counter(x[0] for x in a[:3] + b[:3])
print([x for x, c in counts.items() if c == 2])

Y sin ninguna importación, use un conjunto:

print(set((x[0] for x in a[:3])).intersection(set((x[0] for x in b[:3]))))

Resultados:

['AB', 'EF']
{'AB', 'EF'}
3
Stephen Rauch 25 feb. 2018 a las 20:14

Bueno, primero, podemos comenzar con un bucle for. Queremos pasar de 0 a n, verificar las tuplas de a y b en esos índices, y luego verificar si el primer elemento de esa tupla coincide.

matches = [a [index] [0] for index in range (n) if a [index] [0] == b [index] [0]] 

Que hace lo mismo que:

matches = []
for index in range (n):
    if a [index] [0] == b [index] [0]: matches.append a [index] [0]
-1
Levi Lesches 25 feb. 2018 a las 22:10

Usando la intersección establecida (mejor complejidad sobre la lista in):

def overlapping(x,y, topn=3):
    return {i[0] for i in x[:topn]} & {i[0] for i in y[:topn]}

overlapping(a,b)

Salidas:

{'AB', 'EF'}

Explicación:

{i[0] for i in x[:topn]}

Establecer comprensiones, equivalentes a set(i[0] for i in x[:topn])

{...} & {...}

Establecer intersección, equivalente a set(..).intersection(set(...))

0
ShmulikA 25 feb. 2018 a las 20:19

¿Te refieres a esto?

def overlapping(n, tups_a, tups_b):
    overlapping = set(map(lambda x: x[0], tups_a[:n])).intersection(set(map(lambda x: x[0], tups_b[:n])))
    return list(overlapping)

overlap = overlapping(3, a, b)

['AB', 'EF']
1
eagle 25 feb. 2018 a las 20:06