2016-04-04 11 views
2
r = [['21-09-1995', 3], ['22-11-1995', 2] , ['07-01-1988', 6], ['test', 4], ['12-12-2001', 5]] 

İç içe geçmiş bir listede dateutil'i nasıl kullanacağını bilen var mı?İç içe geçmiş bir listede dateutil nasıl kullanılır?

from dateutil.parser import parse 
r = sorted(r, key=parse) 

hata: 'Liste' nesne Ben dateutils ait gibi tarihleri ​​fakat şeyi ben sıralamak için başka yolları da vardır biliyorum hiçbir özelliği vardır 'okundu'

olmasıdır Ben başarılı olamadı bu çalıştı formatı belirtmeden tarihleri ​​tanır. P.E. 21/09/1995 ve 21-09-1995 tarih olarak görülmektedir.

Beklenen çıkışı: Bu işler

r = [['test', 4], ['07-01-1988', 6], ['21-09-1995', 3], ['22-11-1995', 2], ['12-12-2001', 5]] 

veya

r = [['07-01-1988', 6], ['21-09-1995', 3], ['22-11-1995', 2], ['12-12-2001', 5], ['test', 4]] 
+2

'r = sıralanmış (r, anahtar = lambda değerlerinin (ayrıştırma değerleri [0])) ' –

+0

@PeterWood, sayesinde Peter. Yukarıdaki listeden '[' test ', 4] 'alt listesini çıkardığımda bir sıralama yapar. Değilse, bu hatayı verir: 'DeğerError: Bilinmeyen dize biçimi' – Reman

cevap

1

:

from datetime import datetime 
from dateutil.parser import parse 

def my_parse(lis): 
    try: 
     return parse(lis[0]) 
    except ValueError: 
     return datetime(1, 1, 1) 

print(sorted(r, key=my_parse)) 

Çıktı:

[['test', 4], ['07-01-1988', 6], ['21-09-1995', 3], ['22-11-1995', 2], ['12-12-2001', 5]] 

Alt listelerinizin ilk girişini parse()'a göndermeniz gerekir. test girişi ayrıştırılamaz ve ValueError'u tetikler. Yakala ve yerine beklediğiniz tarih aralığının dışında bir datetime nesnesi döndür.

Kullanım: Eğer sıralanmış sonucunun son olarak test ile girişinizi istiyorsanız

return datetime(9999, 1, 1) 

.

bunu düz veya yuvalanmış bir liste ile çalışmak istiyorsanız giriş bir dize olup olmadığını

, sen kontrol edebilir DÜZENLEME:

r = ['test', '21-09-1995 wednesday', '07-01-1988 tuesday'] 

from datetime import datetime 
from dateutil.parser import parse 

def my_parse(value): 
    try: 
     if isinstance(value, str): 
      return parse(value) 
     else: 
      return parse(value[0]) 
    except ValueError: 
     return datetime(1, 1, 1) 

print(sorted(r, key=my_parse)) 

Bu value varsayar yinelenen içeren dizeler veya bir dizedir.

+0

Teşekkürler Mike. Bu benim sorumu çözer. Sadece bilmek gerekirse, bir futur listesi iç içe geçmiş bir liste değilse, neyi değiştirmek zorundayım? dönüş ayrıştırma (lis [0]) '->' dönüş ayrıştırma (lis) 've' geri dönme zamanı (1, 1, 1) '->? – Reman

+0

Çalışır. Sadece dene. –

+0

haklısın. Tarihlerden sonra daha fazla metin eklediğimde çalışmadı. ['test', '07 -01-1988 Salı ', '21 -09-1995 Çarşamba'] – Reman

1
Sadece yılın başlar int böylece tersine için tarihleri ​​değiştirebilir hiç dateutil gerekmez

:

r = [['21-09-1995', 3], ['22-11-1995', 2] , ['07-01-1988', 6], ['test', 4], ['12-12-2001', 5]] 

def srt(x): 
    try: 
     return int("".join(x[0].split("-")[::-1])) 
    except ValueError: 
     return 0 
r.sort(key=srt) 

Çıktı: Eğer sakıncası yoksa

[['test', 4], ['07-01-1988', 6], ['21-09-1995', 3], ['22-11-1995', 2], ['12-12-2001', 5]] 

sahip sonuna sıralaması metin dizeleri bile basittir:

r.sort(key=lambda x: "".join(x[0].split("-")[::-1])) 

size verecekti o:

Farklı biçimi için
['07-01-1988', 6], ['21-09-1995', 3], ['22-11-1995', 2], ['12-12-2001', 5], ['test', 4]] 

:

r = [['21-09-1995', 3], ['22/11/1995', 2] , ['07-01-1988', 6], ['test', 4], ['12-12-2001', 5]] 

import re 

reg = re.compile("[\-/]") 
r.sort(key=lambda x: "".join(reg.split(x[0])[::-1])) 

Çıktı:

[['07-01-1988', 6], ['21-09-1995', 3], ['22/11/1995', 2], ['12-12-2001', 5], ['test', 4]] 
Esaslı bir fark fark bile regex kullanarak orada görebilirsiniz

:

r = [['21-09-1995', 3], ['22/11/1995', 2] , ['07-01-1988', 6], ['test', 4], ['12-12-2001', 5]] 
r.sort(key=my_parse) 
    ...: 
10000 loops, best of 3: 185 µs per loop 

In [5]: 

In [5]: %%timeit 
r = [['21-09-1995', 3], ['22/11/1995', 2] , ['07-01-1988', 6], ['test', 4], ['12-12-2001', 5]] 
r.sort(key=lambda x: "".join(reg.split(x[0])[::-1])) 
    ...: 
100000 loops, best of 3: 6.56 µs per loop 

In [7]: %%timeit 
r = [['21-09-1995', 3], ['22/11/1995', 2] , ['07-01-1988', 6], ['test', 4], ['12-12-2001', 5]] 
r.sort(key=regex_srt) 
...: 
100000 loops, best of 3: 10.3 µs per loop 

varsa '07 -01-1988 salı 'gibi bir düz liste ve dize:

reg = re.compile("[\-/\s]") 
r = ['test', '02/03/2015 test', '02/09/2016 test', '12/11/2011 test', '22/01/2015 test', '22/01/2010 test', '22/01/2013 test'] 
def srt(x): 
    try: 
     print(reg.split(x)) 
     return int("".join(reg.split(x)[:3][::-1])) 
    except ValueError: 
     return 0 
r.sort(key=srt) 
print(r) 

Çıkış:

['test', '22/01/2010 test', '12/11/2011 test', '22/01/2013 test', '22/01/2015 test', '02/03/2015 test', '02/09/2016 test'] 
+1

OP: * Dateutils'i beğenmem, formatı belirtmeden tarihleri ​​tanıdığıdır. P.E. 21/09/1995 ve 21-09-1995 tarihleri ​​arasında görülüyor. * –

+0

@ MikeMüller, girişte başka tür yok, bu da tarihlerini ayrıştırmaya çalışmaktan çok daha hızlı olurdu. –

+0

@PadraicCunningham, Teşekkürler Cevap. Bu listeyle son fonksiyonunuzu kontrol ettim 'r ['test', '02/03/2015 testi ', '02/09/2016 testi', '12/11/2011 testi ', '22/01/2015 test ', '22/01/2010' test ', '22/01/2013' testi '] ama işe yaramıyor. – Reman

İlgili konular