¿Cómo elimino duplicados y combino varias listas en una sola así?

function([["hello","me.txt"],["good","me.txt"],["good","money.txt"], ["rep", "money.txt"]]) debería devolver exactamente :

[["good", ["me.txt", "money.txt"]], ["hello", ["me.txt"]], ["rep", ["money.txt"]]]
-19
user8618383 29 oct. 2017 a las 00:50

8 respuestas

La mejor respuesta

Cree una matriz vacía, empuje el índice 0 de las matrices secundarias y únase para convertir todos los valores en una cadena separada por espacio.

var your_input_data = [ ["hello","hi", "jel"], ["good"], ["good2","lo"], ["good3","lt","ahhahah"], ["rep", "nice","gr8", "job"] ];

var myprint = []
for(var i in your_input_data){
   myprint.push(your_input_data[i][0]);
}
console.log(myprint.join(' '))
-4
martineau 3 nov. 2017 a las 16:39

También puedes hacerlo con los diccionarios tradicionales.

In [30]: l1 = [["hello","me.txt"],["good","me.txt"],["good","money.txt"], ["rep", "money.txt"]]

In [31]: for i, j in l1:
    ...:     if i not in d2:
    ...:         d2[i] = j
    ...:     else:
    ...:         val = d2[i]
    ...:         d2[i] = [val, j]
    ...:         

In [32]: d2
Out[32]: {'good': ['me.txt', 'money.txt'], 'hello': 'me.txt', 'rep': 'money.txt'}

In [33]: out = [ [key,d1[key]] for key in d1]

In [34]: out
Out[34]: 
[['rep', ['money.txt']],
['hello', ['me.txt']],
['good', ['me.txt', 'money.txt']]]
-1
privatevoid 3 nov. 2017 a las 09:43

El uso de Python para crear una función que le proporcione el resultado exacto requerido se puede hacer de la siguiente manera:

from collections import defaultdict

def function(data):    
    entries = defaultdict(list)

    for k, v in data:
        entries[k].append(v)

    return sorted([k, v] for k, v in entries.items())

print function([["hello","me.txt"],["good","me.txt"],["good","money.txt"], ["rep", "money.txt"]])  

Esto mostraría el retorno de la función como:

[['good', ['me.txt', 'money.txt']], ['hello', ['me.txt']], ['rep', ['money.txt']]]  

También asegura que las claves estén ordenadas. Se utiliza un diccionario para tratar la eliminación de duplicados (ya que las claves deben ser únicas).

Un defaultdict() se usa para simplificar la creación de listas dentro del diccionario. La alternativa sería intentar agregar un nuevo valor a una clave existente, y si hay una excepción KeyError, agregue la nueva clave de la siguiente manera:

def function(data):    
    entries = {}

    for k, v in data:
        try:
            entries[k].append(v)
        except KeyError as e:
            entries[k] = [v]

    return sorted([k, v] for k, v in entries.items())
-1
Martin Evans 6 nov. 2017 a las 17:00

La más fácil sería usar defaultdict.

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> for i,j in l: 
        d[i].append(j)                   #append value to the key
>>> d
=> defaultdict(<class 'list'>, {'hello': ['me.txt'], 'good': ['me.txt', 'money.txt'], 
                                'rep': ['money.txt']})

    #to get it in a list
>>> out = [ [key,d[key]] for key in d]
>>> out
=> [['hello', ['me.txt']], ['good', ['me.txt', 'money.txt']], ['rep', ['money.txt']]]

# valores del controlador:

IN : l = [["hello","me.txt"],["good","me.txt"],["good","money.txt"], ["rep", "money.txt"]]
1
Kaushik NP 1 nov. 2017 a las 10:02

Pruebe esto (no se necesita biblioteca):

your_input_data = [ ["hello","me.txt"], ["good","me.txt"], ["good","me.txt"], ["good","money.txt"], ["rep", "money.txt"] ]


my_dict = {}
for box in your_input_data:

    if box[0] in my_dict:

        buffer_items = []
        for items in box[1:]:
            if items not in my_dict[box[0]]:
                buffer_items.append(items)

        remove_dup = list(set(buffer_items + my_dict[box[0]]))
        my_dict[box[0]] = remove_dup

    else:

        buffer_items = []
        for items in box[1:]:
            buffer_items.append(items)

        remove_dup = list(set(buffer_items))

        my_dict[box[0]] = remove_dup


last_point = [[keys, values] for keys, values in my_dict.items()]

print(last_point)

Buena suerte ...

0
DRPK 31 oct. 2017 a las 22:03

Esto se puede resolver fácilmente usando dict y sets.

def combine_duplicates(given_list):
    data = {}
    for element_1, element_2 in given_list:
        data[element_1] = data.get(element_1, set()).add(element_2)
    return [[k, list(v)] for k, v in data.items()]
-1
N M 7 nov. 2017 a las 10:06

Primero entendamos el problema real:

Sugerencia de ejemplo:

Para estos tipos de problemas de lista hay un patrón:

Supongamos que tiene una lista:

a=[(2006,1),(2007,4),(2008,9),(2006,5)]

Y desea convertir esto a un dict como primer elemento de la tupla como clave y segundo elemento de la tupla. algo como :

{2008: [9], 2006: [5], 2007: [4]}

Pero hay una trampa que también desea que las claves que tienen valores diferentes pero las claves son las mismas que las teclas (2006,1) y (2006,5) son las mismas pero los valores son diferentes. desea que esos valores se agreguen con una sola clave, por lo que se espera la salida:

{2008: [9], 2006: [1, 5], 2007: [4]}

Para este tipo de problema hacemos algo como esto:

Primero creamos un nuevo dict luego seguimos este patrón:

if item[0] not in new_dict:
    new_dict[item[0]]=[item[1]]
else:
    new_dict[item[0]].append(item[1])

Entonces, primero verificamos si la clave está en un nuevo dict y si ya está, luego agregamos el valor de la clave duplicada a su valor:

Código completo:

a=[(2006,1),(2007,4),(2008,9),(2006,5)]

new_dict={}

for item in a:
    if item[0] not in new_dict:
        new_dict[item[0]]=[item[1]]
    else:
        new_dict[item[0]].append(item[1])

print(new_dict)

Su solución de problema real:

list_1=[["hello","me.txt"],["good","me.txt"],["good","money.txt"], ["rep", "money.txt"]]

no_dublicates={}

for item in list_1:
    if item[0] not in no_dublicates:
        no_dublicates[item[0]]=["".join(item[1:])]
    else:
        no_dublicates[item[0]].extend(item[1:])

list_result=[]
for key,value in no_dublicates.items():
    list_result.append([key,value])
print(list_result)

Salida:

[['hello', ['me.txt']], ['rep', ['money.txt']], ['good', ['me.txt', 'money.txt']]]
-1
Aaditya Ura 5 nov. 2017 a las 18:23
yourList=[["hello","me.txt"],["good","me.txt"],["good","money.txt"], ["rep", "money.txt"]]
expectedList=[["good", ["me.txt", "money.txt"]], ["hello", ["me.txt"]], ["rep", ["money.txt"]]]

def getall(allsec, listKey, uniqlist):
    if listKey not in uniqlist:
        uniqlist.append(listKey)
        return [listKey, [x[1] for x in allsec if x[0] == listKey]]

uniqlist=[]
result=sorted(list(filter(lambda x:x!=None, [getall(yourList,elem[0],uniqlist) for elem in yourList])))
print(result)

Espero que esto ayude

-1
Ajayi Oluwaseun Emmanuel 6 nov. 2017 a las 03:17