2016-03-22 13 views
0

tekrarlanan değer sayısını yazın:listeleri içinde 1 elemanını karşılaştırın ve ben şöyle listelerinin listesi var

Burada (iç listelerinde 1 değerini karşılaştırmak gerekir fails = [['55','35325235432','log'], ['55','22222222','log'], ['55','3232432','log2'], ['64','55','log3'], ['64','324234324','log2']]

bu kadar '55' ve '64') ve diğer listelerde tekrarlanırsa, tekrarlanan listeler silinmelidir. Fakat bu tekrarlanan değerlerin sayısı ilk listeye eklenmelidir.

de

Yani ve olması gerektiği gibidir: eşsiz bir değere sahip

shorten_fails = [['55','35325235432','log','3'], ['64','55','log3', '2']]

İlk liste korunur ve 1. pozisyonda bu değerle listelerin sayısı eklenir.

ben döngü ile ama bitmiş sonunda bu yapmaya çalıştığım şurada en çok en çok yapmak daha kolay bir yolu olmalı eminim için ... ve

+0

Bu her zaman 2 düzeyli yuvalanmış liste midir? İlk sayının ilk indeks dışında görünebileceği bir durum var mı? – Lafexlos

+0

Evet, her zaman 2 düzeyli, ve başka bir dizide ilk sayının görünebilme olasılığı var (örneğin yukarıda bu durum var) – GohanP

cevap

2

:

[['55', '3232432', 'log2', 3], ['64', '324234324', 'log2', 2]] 

v1_counts tüm değerleri sayımını tutan:

from collections import Counter, OrderedDict 

fails = [['55','35325235432','log'], ['55','22222222','log'], ['55','3232432','log2'], ['64','55','log3'], ['64','324234324','log2']] 

v1_counts = Counter(v[0] for v in fails) 
v1 = OrderedDict({v[0] : v for v in fails}) 
shorten_fails = [v + [v1_counts[k]] for k, v in v1.items()] 

print shorten_fails 

Bu aşağıdaki çıktıyı görüntüleyecektir örneğin

Counter({'55': 3, '64': 2}) 

v1 yani

OrderedDict([('55', ['55', '3232432', 'log2']), ('64', ['64', '324234324', 'log2'])]) 

Son olarak shorten_failsv1 girdileri almak ve her bir elemanına karşılık gelen sayaç değerini eklenerek oluşturulur, her değerin son giriş tutar.

1
fails = [['55','35325235432','log'], ['55','22222222','log'], ['55','3232432','log2'], ['64','55','log3'], ['64','324234324','log2']] 

first_elems = set(fail[0] for fail in fails) 
new_fails = [] 
for fail in fails: 
    first = fail[0] 
    if first in first_elems: 
     new_fails.append(fail + [sum(f[0] == first for f in fails)]) 
     first_elems.remove(first) 

print(new_fails) 
# [['55', '35325235432', 'log', 3], ['64', '55', 'log3', 2]] 
1

o

def shorten(fails): 
    sf, ind = [], {} 
    for el in fails: 
     if el[0] in ind: 
      sf[ind[el[0]]][-1] += 1 
     else: 
      ind[el[0]] = len(sf) 
      sf.append(el + [1]) 
    return sf 

>>> shorten(fails) 
[['55', '35325235432', 'log', 3], ['64', '55', 'log3', 2]] 

: sen zaten kısaltılmış listeye eklediğiniz elemanların endekslerini saklamak için arama tablosu olarak bir sözlük kullanabilirsiniz Sayacın gerçekten bir dizge olmasını istiyorsanız, son liste öğesinin sonundaki dönüşümü kolayca yapabilirsiniz.

aşağıdaki gibi Python'un Counter ve OrderedDict özelliklerinden faydalanmak olabilir
+0

Evet, bir dize olarak buna ihtiyacım var, ama sorun değil, sadece dönüştürdüm. Harika çalışıyor, teşekkürler! – GohanP

İlgili konular