Maison > Questions et réponses > le corps du texte
['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']
tableau numpy, avec un total de dizaines de milliers d'éléments. Maintenant, je souhaite conserver le numéro 000001 ou similaire devant chaque élément et supprimer les doublons, ne laissant qu'un numéro unique. Le résultat devrait être ['000001','000002','000003','000004']
En plus d'utiliser l'instruction for, existe-t-il un moyen plus efficace ?
迷茫2017-06-30 09:58:09
Écrivons 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')
Vous pouvez également l'écrire comme ceci : np.frompyfunc
'|S6'
consiste à stocker la chaîne sur 6 octets
'<U6'
是以6个小端序Unicode字符
Ficelle de magasin
>>> 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
Basé sur les méthodes d'écriture des deux frères
@agree and accept @xiaojieluoff
Si la longueur du nombre est fixée aux six premiers chiffres, la manière la plus rapide de l'écrire est le premier ci-dessous
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
Utilisez la carte et les fonctions anonymes
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)
Sortie :
['000003', '000004', '000001', '000002']
Exécutez le code suivant et vous verrez qu'avec 6 millions de données, la carte est environ 0,6 seconde plus rapide que pour
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))
Sortie :
map 运行时间:2.36173
for 运行时间:2.9405870000000003
Si les données de test sont étendues à 60 millions, l'écart sera encore plus évident
map 运行时间:29.620203
for 运行时间:33.132621