¿Cómo puedo poner un elemento de una cadena en una lista con un determinado comportamiento?

list1 = ['A', 'B'] list2 = [[(1, 1), (1, 2), (1, 3), (1, 4), (2, 1), (2, 2), (2, 3), (2, 4)]] 

Necesito mi salida como:

 [[(1, 1), (1, 2), (1, 3), (1, 4)],[(2, 1), (2, 2), (2, 3), (2, 4)]] 

Ahora si lo sé:

  • longitud de sublist1 = 4
  • longitud de sublist2 = 4

Entonces, ¿cómo puedo poner todo esto en un diccionario como:

 {'A':length of sublist1, 'B':length of sublist2} 

Usando split y groupby:

 >>> from itertools import groupby >>> data = [map(int, (z for z in x.split(','))) for x in string1.split()] >>> a, b = [list(j) for j in groupby(data, key=operator.itemgetter(0))] >>> a [[1, 1], [1, 2], [1, 3], [1, 4]] >>> b [[2, 1], [2, 2], [2, 3], [2, 4]] 

Entonces puedes hacer:

 >>> dict(zip(list1, (len(i) for i in (a,b)))) {'A': 4, 'B': 4} 

Parece que tienes que jugar un poco con tus datos para reducirlos a la forma en que los quieres. Como lo demuestra la primera sección a continuación y luego tendrá que crear un diccionario y luego buscar los valores en el dict. Aquí está el código para sus datos de muestra. Deberías ser capaz de construir sobre eso.

 >>> string1 = '1,1 1,2 1,3 1,4 2,1 2,2 2,3 2,4' >>> list1 = string1.split(',') >>> list2 = [tuple(map(int, a.split(','))) for a in list1] [(1, 1), (1, 2), (1, 3), (1, 4), (2, 1), (2, 2), (2, 3), (2, 4)] >>> temp_dict = {} >>> for each in list2: ... a = each[0] ... if a in temp_dict: ... temp_dict[a].append(each) ... else: ... temp_dict[a] = [each] ... >>> temp_dict.values() [[(1, 1), (1, 2), (1, 3), (1, 4)], [(2, 1), (2, 2), (2, 3), (2, 4)]] 

Puede obtener la lista de listas de la siguiente manera:

 from collections import defaultdict data = defaultdict(list) for val in string1.split(): v1, v2 = val.split(',') data[v1].append(v2) result = [[(int(key), int(v)) for v in values] for key, values in data.items()] 

Para obtener el diccionario puedes hacer:

 d = dict(zip(list1, result)) 

Esto le da una lista con los elementos de list1 como claves. Para obtener las longitudes que puedes hacer:

 d = dict([(key, len(ls)) for key, ls in zip(list1, result)]) 

Tome su lista de tuplas y divídala en listas separadas según el primer número de cada tupla. En el mismo paso, agregue la lista filtrada al diccionario con la clave correspondiente de list1 . Debido a los dobles corchetes en la list2 (copiados a continuación), los datos reales están en la list2[0] .

 //note the double brackets, data is in list2[0], not list2 list2 = [[(1, 1), (1, 2), (1, 3), (1, 4), (2, 1), (2, 2), (2, 3), (2, 4)]] d = dict() for i in range (0, len(list1)): d[list1[i]] = [x for x in list2[0] if x[0] == i+1] //on the first run though, list[i] will be 'A' and will be set to [(1, 1), (1, 2), (1, 3), (1, 4)] //on the 2nd run though, list[i] will be 'B' and will be set to [(2, 1), (2, 2), (2, 3), (2, 4)] 

Imprimiendo d muestra los datos formateados

 print(d) //prints {'A': [(1, 1), (1, 2), (1, 3), (1, 4)], 'B': [(2, 1), (2, 2), (2, 3), (2, 4)]} 

EDITAR: He leído mal la pregunta (pensé que quería los datos reales en el diccionario, no solo las longitudes). Para obtener la longitud de la lista en lugar de los contenidos, simplemente ajuste la comprensión de la segunda lista en un len() como

 len([x for x in list2[0] if x[0] == i+1]) 

Después de ese cambio, d contendrá las longitudes, no los datos:

 print(d) //{'A': 4, 'B': 4}