Rumah > Soal Jawab > teks badan
['000001_2017-03-17.csv', '000001_2017-03-20.csv',
'000002_2017-03-21.csv', '000002_2017-03-22.csv',
'000003_2017-03-23.csv', '000004_2017-03-24.csv']
tatasusunan numpy, dengan jumlah puluhan ribu elemen. Sekarang saya mahu mengekalkan nombor 000001 atau sebagainya di hadapan setiap elemen, dan mengalih keluar pendua, hanya meninggalkan nombor unik. Hasilnya sepatutnya ['000001','000002','000003','000004']
Selain menggunakan pernyataan for, adakah cara yang lebih berkesan?
迷茫2017-06-30 09:58:09
Jom tulis NumPy~
python3
>>> import numpy as np
>>> a = np.array(['000001_2017-03-17.csv', '000001_2017-03-20.csv',
'000002_2017-03-21.csv', '000002_2017-03-22.csv',
'000003_2017-03-23.csv', '000004_2017-03-24.csv'])
>>> b = np.unique(np.fromiter(map(lambda x:x.split('_')[0],a),'|S6'))
>>> b
array([b'000001', b'000002', b'000003', b'000004'],
dtype='|S6')
Anda juga boleh menulisnya seperti ini: np.frompyfunc
'|S6'
ialah untuk menyimpan rentetan dalam 6 bait
'<U6'
是以6个小端序Unicode字符
Simpan tali
>>> b = np.array(np.unique(np.frompyfunc(lambda x:x[:6],1,1)(a)),dtype='<U6')
>>> b
array(['000001', '000002', '000003', '000004'],
dtype='<U6')
学习ing2017-06-30 09:58:09
Berdasarkan kaedah penulisan dua beradik
@setuju dan terima @xiaojieluoff
Jika panjang nombor ditetapkan kepada enam digit pertama, cara terpantas untuk menulisnya ialah yang pertama di bawah
import time
lst = ['000001_2017-03-17.csv', '000001_2017-03-20.csv', '000002_2017-03-21.csv', '000002_2017-03-22.csv', '000003_2017-03-23.csv', '000004_2017-03-24.csv'] * 1000000
start = time.time()
data = {_[:6] for _ in lst}
print 'dic: {}'.format(time.time() - start)
start = time.time()
data = set(_[:6] for _ in lst)
print 'set: {}'.format(time.time() - start)
start = time.time()
data = set(map(lambda _: _[:6], lst))
print('map:{}'.format(time.time() - start))
start = time.time()
data = set()
[data.add(_[:6]) for _ in lst]
print('for:{}'.format(time.time() - start))
耗时:
dic: 0.72798705101
set: 0.929664850235
map:1.89214396477
for:1.76194214821
某草草2017-06-30 09:58:09
Gunakan peta dan fungsi tanpa nama
lists = ['000001_2017-03-17.csv', '000001_2017-03-20.csv','000002_2017-03-21.csv','000002_2017-03-22.csv','000003_2017-03-23.csv', '000004_2017-03-24.csv']
data = list(set(map(lambda x:x.split('_')[0], lists)))
print(data)
Keluaran:
['000003', '000004', '000001', '000002']
Jalankan kod berikut dan anda dapat melihat bahawa dengan 6 juta keping data, peta adalah kira-kira 0.6s lebih pantas daripada
import time
lists = ['000001_2017-03-17.csv', '000001_2017-03-20.csv', '000002_2017-03-21.csv', '000002_2017-03-22.csv', '000003_2017-03-23.csv', '000004_2017-03-24.csv'] * 1000000
map_start = time.clock()
map_data = list(set(map(lambda x:x.split('_')[0], lists)))
map_end = (time.clock() - map_start)
print('map 运行时间:{}'.format(map_end))
for_start = time.clock()
data = set()
for k in lists:
data.add(k.split('_')[0])
for_end = (time.clock() - for_start)
print('for 运行时间:{}'.format(for_end))
Keluaran:
map 运行时间:2.36173
for 运行时间:2.9405870000000003
Jika data ujian dikembangkan kepada 60 juta, jurang akan menjadi lebih jelas
map 运行时间:29.620203
for 运行时间:33.132621