Как можно на Python получить длину строки, но чтобы не считались пробелы? К примеру,
чтобы длина "99 99 99 99" равнялась длине "9999 9999"
Ответы
Ответ 1
Можно так: len(str.replace(" ", ""))
Ответ 2
Можно просто вычесть кол-во пробелов: n = len(s) - s.count(" ").
Достоинство, что не требуется новую строку создавать: O(1) в памяти—для больших строк
может иметь значение в производительности.
Если нужно поддерживать произвольные пробельные символы (перевод строки '\n', таб
'\t', неразрывный пробел (U+00A0), итд), то можно использовать регулярное выражение,
чтобы посчитать кол-во непробельных символов в строке:
import re
n = len(re.findall(u"\\S", s, flags=re.UNICODE))
ответ близок к n = len(''.join(s.split())) или другому способу, основанному на удалении
пробелов из строки.
Можно избежать создания нового списка, если использовать finditer():
n = sum(1 for m in re.finditer(u"\\S", s, flags=re.UNICODE) if m)
этот код требует O(1)памяти (константа независящая от размера входной строки), но
на практике даже для умеренно больших строк он может быть медленнее более жадных вариантов,
где память пропорциональна вводу O(n) (решения, использующие список, новую строку).
Ответ 3
len(''.join("99 99 99 99".split()))
сравнение быстродействия способов:
import timeit, sys, itertools, re, random, string
def var1():
return len([s for s in _str if not s == ' '])
def var2():
return len(list(itertools.chain(*_str.split())))
def var3():
return len(''.join(_str.split()))
def var4(ln=0):
for с in _str:
if с != ' ': ln += 1
return ln
def var5():
return sum(map(lambda c: int(not(c == ' ')) , _str))
def var6():
return sum(map(lambda c: 1 if c != ' ' else 0, _str))
def var7():
return len(_str.replace(" ", ""))
def var8():
return len(_str) - _str.count(" ")
def var9():
return len(re.findall(u"\\S", _str, flags=re.UNICODE))
def var10():
return sum(1 for m in re.finditer(u"\\S", _str, flags=re.UNICODE) if m)
def print_results(data: dict):
# печать результатов одного прохода
x = ['average', 'min', 'max']
f = ' {:<12}' * (len(x) + 1)
print(f.format('', *x))
for e, (k, v) in enumerate(sorted(data.items(), key=lambda it: it[1][1]), start=1):
gv = ('{:f}'.format(g) for g in v)
print(f.format('%s %s' % (e, k), *gv))
# начисление "баллов", кто первее, тоиу больше - enumerate
for e, (k, v) in enumerate(sorted(data.items(), key=lambda it: it[1][1], reverse=True),
start=1):
try: best_var[k] += e
except KeyError: best_var[k] = e
def get_str(size: int, asc: bool, a=5, b=10, i=''):
# ascii или ascii+noascii символы
asc_ = ''.join(map(chr, range(256))) if asc else string.ascii_letters
_str, ln = '', 0
# увеличивать строку, пока размер не станет нужным
while ln < size:
_str += ' ' + ''.join(random.choice(asc_) for _ in range(random.randint(a,
b))) # a, b - регулировать пробелы
ln = int(sys.getsizeof(_str)/1024)
# инфо о строке
ss = _str.split()
c = len(ss)
l, c, = len(_str), _str.count(' ')
w = sum(len(s) for s in ss)/c
print('\n~{}Kb, символы {} {}, {} ~ {:.3}%, сред длина слова:{:f}\nby :'.format(
ln, l, 'ascii+noascii' if asc else 'ascii', i, c/l*100, w))
return _str
if __name__ == '__main__':
best_var = {}
repeat, count = 5, 1
target = [n for n in globals() if n.startswith('var')]
# размеры строк
for size in 1, 1024, 1024*10:
data = {}
# ascii или ascii+noascii строка
for asc in True, False:
# кол-во пробелов
for i, a, b in (['минимум пробелов', 20, 25],
['сред пробелов', 4, 5],
['много пробелов', 1, 2],
['случайно пробелов', 1, 1000]):
# сформировать строку
_str = get_str(size, asc, a, b, i)
# выполнить var функции
for n in target:
t = timeit.Timer(globals()[n]).repeat(repeat, count)
data.update({n: [sum(t)/repeat, min(t), max(t)]})
print_results(data) # вывести результат для строки
# вывести баллы
print('\n'+'-'*20)
for e, (k, v) in enumerate(sorted(best_var.items(), key=lambda kv: kv[1], reverse=True),
start=1):
print('{} место {:<5} - {} баллов'.format(e, k, v))
out:
~1Kb, символы 989 ascii+noascii, минимум пробелов ~ 4.65%, сред длина слова:19.347826
by :
average min max
1 var8 0.000004 0.000003 0.000005
2 var7 0.000006 0.000006 0.000008
3 var3 0.000022 0.000022 0.000025
4 var2 0.000063 0.000054 0.000085
5 var1 0.000124 0.000117 0.000134
6 var4 0.000172 0.000157 0.000187
7 var9 0.000264 0.000157 0.000401
8 var6 0.000235 0.000213 0.000295
9 var10 0.000311 0.000279 0.000343
10 var5 0.000439 0.000389 0.000494
~1Kb, символы 989 ascii+noascii, сред пробелов ~ 18.4%, сред длина слова:4.252747
by :
average min max
1 var8 0.000004 0.000003 0.000004
2 var7 0.000013 0.000012 0.000015
3 var3 0.000031 0.000030 0.000033
4 var2 0.000072 0.000068 0.000081
5 var1 0.000115 0.000111 0.000130
6 var9 0.000145 0.000138 0.000164
7 var4 0.000150 0.000143 0.000165
8 var6 0.000235 0.000213 0.000259
9 var10 0.000267 0.000258 0.000283
10 var5 0.000417 0.000385 0.000468
~1Kb, символы 987 ascii+noascii, много пробелов ~ 40.7%, сред длина слова:1.375622
by :
average min max
1 var8 0.000005 0.000004 0.000006
2 var7 0.000019 0.000018 0.000020
3 var3 0.000038 0.000035 0.000045
4 var2 0.000086 0.000076 0.000112
5 var9 0.000106 0.000098 0.000137
6 var1 0.000120 0.000104 0.000153
7 var4 0.000119 0.000117 0.000123
8 var10 0.000193 0.000178 0.000228
9 var6 0.000228 0.000216 0.000264
10 var5 0.000409 0.000386 0.000447
~1Kb, символы 1491 ascii+noascii, случайно пробелов ~ 0.738%, сред длина слова:127.818182
by :
average min max
1 var8 0.000003 0.000003 0.000004
2 var7 0.000004 0.000004 0.000005
3 var3 0.000027 0.000026 0.000029
4 var2 0.000078 0.000068 0.000109
5 var1 0.000207 0.000201 0.000223
6 var9 0.000247 0.000229 0.000274
7 var4 0.000261 0.000235 0.000312
8 var6 0.000344 0.000319 0.000381
9 var10 0.000459 0.000439 0.000503
10 var5 0.000605 0.000572 0.000640
~1Kb, символы 1007 ascii, минимум пробелов ~ 4.27%, сред длина слова:22.418605
by :
average min max
1 var8 0.000003 0.000003 0.000004
2 var7 0.000006 0.000005 0.000007
3 var3 0.000009 0.000008 0.000010
4 var2 0.000045 0.000040 0.000056
5 var1 0.000139 0.000116 0.000164
6 var9 0.000168 0.000151 0.000187
7 var4 0.000161 0.000151 0.000195
8 var6 0.000229 0.000214 0.000275
9 var10 0.000303 0.000299 0.000314
10 var5 0.000406 0.000383 0.000435
~1Kb, символы 1001 ascii, сред пробелов ~ 18.0%, сред длина слова:4.561111
by :
average min max
1 var8 0.000003 0.000003 0.000004
2 var7 0.000012 0.000011 0.000012
3 var3 0.000019 0.000018 0.000020
4 var2 0.000064 0.000056 0.000091
5 var1 0.000117 0.000105 0.000148
6 var9 0.000142 0.000131 0.000177
7 var4 0.000151 0.000138 0.000182
8 var6 0.000222 0.000213 0.000257
9 var10 0.000265 0.000253 0.000302
10 var5 0.000409 0.000382 0.000451
~1Kb, символы 1001 ascii, много пробелов ~ 40.0%, сред длина слова:1.502500
by :
average min max
1 var8 0.000004 0.000004 0.000005
2 var7 0.000021 0.000020 0.000023
3 var3 0.000033 0.000031 0.000036
4 var2 0.000077 0.000076 0.000081
5 var1 0.000111 0.000099 0.000139
6 var9 0.000110 0.000104 0.000138
7 var4 0.000123 0.000123 0.000124
8 var10 0.000207 0.000197 0.000231
9 var6 0.000234 0.000225 0.000257
10 var5 0.000419 0.000408 0.000441
~1Kb, символы 1357 ascii, случайно пробелов ~ 0.221%, сред длина слова:451.333333
by :
average min max
1 var8 0.000002 0.000002 0.000003
2 var7 0.000003 0.000003 0.000004
3 var3 0.000004 0.000004 0.000005
4 var2 0.000047 0.000044 0.000051
5 var1 0.000161 0.000150 0.000198
6 var9 0.000217 0.000208 0.000246
7 var4 0.000221 0.000210 0.000264
8 var6 0.000302 0.000287 0.000339
9 var10 0.000449 0.000418 0.000470
10 var5 0.000557 0.000517 0.000579
~1024Kb, символы 1048550 ascii+noascii, минимум пробелов ~ 4.62%, сред длина слова:19.736590
by :
average min max
1 var8 0.001648 0.001501 0.001976
2 var7 0.004883 0.004693 0.005125
3 var3 0.020394 0.019550 0.021583
4 var2 0.062164 0.060919 0.063352
5 var1 0.144303 0.135828 0.159222
6 var9 0.178833 0.176592 0.182050
7 var4 0.199833 0.196554 0.205470
8 var6 0.251038 0.246122 0.259824
9 var10 0.335161 0.331631 0.338379
10 var5 0.452639 0.443677 0.466173
~1024Kb, символы 1048543 ascii+noascii, сред пробелов ~ 18.5%, сред длина слова:4.216881
by :
average min max
1 var8 0.002237 0.002042 0.002632
2 var7 0.011823 0.011346 0.012312
3 var3 0.033965 0.032902 0.034526
4 var2 0.084031 0.081243 0.087056
5 var1 0.127829 0.126500 0.129401
6 var9 0.158385 0.154023 0.162586
7 var4 0.180536 0.178501 0.182689
8 var6 0.250811 0.246209 0.255653
9 var10 0.285592 0.283369 0.288488
10 var5 0.454162 0.445657 0.470404
~1024Kb, символы 1048539 ascii+noascii, много пробелов ~ 40.2%, сред длина слова:1.422101
by :
average min max
1 var8 0.002705 0.002559 0.002869
2 var7 0.019173 0.018673 0.019514
3 var3 0.044011 0.041986 0.045685
4 var2 0.092004 0.090061 0.095451
5 var1 0.117086 0.112984 0.122531
6 var9 0.116413 0.113467 0.120848
7 var4 0.152174 0.150377 0.154708
8 var10 0.209933 0.203534 0.214091
9 var6 0.255368 0.251358 0.260667
10 var5 0.449192 0.448205 0.450778
~1024Kb, символы 1048798 ascii+noascii, случайно пробелов ~ 0.585%, сред длина слова:162.651182
by :
average min max
1 var8 0.000781 0.000757 0.000808
2 var7 0.002128 0.001986 0.002363
3 var3 0.014138 0.013806 0.014757
4 var2 0.056218 0.054372 0.059153
5 var1 0.141643 0.137505 0.146517
6 var9 0.188750 0.184148 0.193892
7 var4 0.205695 0.201427 0.209657
8 var6 0.265923 0.258749 0.275960
9 var10 0.344992 0.331897 0.352945
10 var5 0.458320 0.446551 0.482520
~1024Kb, символы 1048574 ascii, минимум пробелов ~ 4.26%, сред длина слова:22.496930
by :
average min max
1 var8 0.001505 0.001434 0.001623
2 var7 0.004558 0.004468 0.004666
3 var3 0.006457 0.006183 0.006700
4 var2 0.045978 0.045481 0.046309
5 var1 0.136627 0.132597 0.143002
6 var9 0.180005 0.172714 0.186334
7 var4 0.195560 0.193381 0.200404
8 var6 0.243767 0.238857 0.246907
9 var10 0.333131 0.328723 0.344105
10 var5 0.439651 0.432095 0.446828
~1024Kb, символы 1048554 ascii, сред пробелов ~ 18.2%, сред длина слова:4.498592
by :
average min max
1 var8 0.002240 0.002156 0.002484
2 var7 0.011550 0.011379 0.011812
3 var3 0.019653 0.018650 0.020899
4 var2 0.064917 0.063636 0.066031
5 var1 0.122076 0.120085 0.123909
6 var9 0.151459 0.148554 0.153874
7 var4 0.178413 0.175546 0.183586
8 var6 0.244974 0.243148 0.246615
9 var10 0.283760 0.279793 0.286557
10 var5 0.444185 0.440670 0.446956
~1024Kb, символы 1048552 ascii, много пробелов ~ 40.0%, сред длина слова:1.500690
by :
average min max
1 var8 0.002606 0.002548 0.002662
2 var7 0.019870 0.019037 0.020380
3 var3 0.033964 0.032878 0.036014
4 var2 0.086213 0.085267 0.087383
5 var1 0.111353 0.109741 0.114724
6 var9 0.112563 0.111011 0.114503
7 var4 0.150361 0.147747 0.152117
8 var10 0.210284 0.209237 0.210916
9 var6 0.250411 0.247752 0.257964
10 var5 0.453721 0.449482 0.457010
~1024Kb, символы 1048782 ascii, случайно пробелов ~ 0.197%, сред длина слова:506.147969
by :
average min max
1 var8 0.000675 0.000646 0.000688
2 var7 0.001583 0.001502 0.001764
3 var3 0.002933 0.002437 0.003270
4 var2 0.044154 0.043674 0.045305
5 var1 0.135097 0.134006 0.136763
6 var9 0.192888 0.190767 0.194671
7 var4 0.200822 0.199586 0.203285
8 var6 0.242871 0.240081 0.246809
9 var10 0.352606 0.344659 0.360171
10 var5 0.440387 0.433437 0.446731
~10240Kb, символы 10485723 ascii+noascii, минимум пробелов ~ 4.63%, сред длина слова:19.713800
by :
average min max
1 var8 0.015642 0.015346 0.016142
2 var7 0.050325 0.049391 0.052610
3 var3 0.210275 0.209163 0.212247
4 var2 0.676338 0.669641 0.682927
5 var1 1.389115 1.368039 1.398386
6 var9 1.821897 1.803700 1.843339
7 var4 1.994729 1.989236 2.000370
8 var6 2.491980 2.478701 2.511737
9 var10 3.274745 3.246427 3.296595
10 var5 4.452530 4.420066 4.492152
~10240Kb, символы 10485725 ascii+noascii, сред пробелов ~ 18.5%, сред длина слова:4.214989
by :
average min max
1 var8 0.022165 0.021553 0.022992
2 var7 0.119701 0.117069 0.122963
3 var3 0.363989 0.359079 0.367310
4 var2 0.885933 0.878938 0.891297
5 var1 1.294802 1.277431 1.311001
6 var9 1.617785 1.611125 1.622048
7 var4 1.818916 1.810579 1.830913
8 var6 2.547398 2.510476 2.582020
9 var10 2.828624 2.809815 2.854437
10 var5 4.480788 4.459377 4.500519
~10240Kb, символы 10485725 ascii+noascii, много пробелов ~ 40.2%, сред длина слова:1.421055
by :
average min max
1 var8 0.028091 0.027061 0.030288
2 var7 0.196943 0.195305 0.199955
3 var3 0.474881 0.461343 0.482662
4 var2 1.008938 0.997040 1.027451
5 var1 1.161058 1.136066 1.171011
6 var9 1.215664 1.164296 1.233138
7 var4 1.543121 1.527249 1.553288
8 var10 2.080153 2.052537 2.101885
9 var6 2.522675 2.515321 2.530619
10 var5 4.563395 4.491082 4.623651
~10240Kb, символы 10486201 ascii+noascii, случайно пробелов ~ 0.587%, сред длина
слова:162.080908
by :
average min max
1 var8 0.007789 0.007583 0.008320
2 var7 0.019142 0.018552 0.019879
3 var3 0.165453 0.162585 0.168957
4 var2 0.615963 0.611608 0.620655
5 var1 1.440067 1.421817 1.455080
6 var9 1.899005 1.880525 1.917015
7 var4 2.041620 2.014194 2.117118
8 var6 2.530870 2.444620 2.644582
9 var10 3.375323 3.322056 3.430780
10 var5 4.403470 4.363339 4.462611
~10240Kb, символы 10485746 ascii, минимум пробелов ~ 4.26%, сред длина слова:22.500840
by :
average min max
1 var8 0.015668 0.015235 0.016608
2 var7 0.045992 0.045382 0.046675
3 var3 0.076034 0.074871 0.076558
4 var2 0.534177 0.530063 0.538483
5 var1 1.335994 1.329036 1.342069
6 var9 1.802360 1.792313 1.820512
7 var4 1.954488 1.942886 1.964544
8 var6 2.426299 2.420271 2.436364
9 var10 3.302575 3.286494 3.319168
10 var5 4.434964 4.352420 4.603488
~10240Kb, символы 10485737 ascii, сред пробелов ~ 18.2%, сред длина слова:4.499947
by :
average min max
1 var8 0.021396 0.020741 0.021759
2 var7 0.114626 0.113296 0.115541
3 var3 0.226316 0.222824 0.229988
4 var2 0.728126 0.721727 0.737932
5 var1 1.257480 1.250478 1.265838
6 var9 1.558776 1.552425 1.565449
7 var4 1.782327 1.774427 1.787684
8 var6 2.444034 2.425254 2.466785
9 var10 2.867036 2.849253 2.882571
10 var5 4.398630 4.370555 4.425208
~10240Kb, символы 10485735 ascii, много пробелов ~ 40.0%, сред длина слова:1.499905
by :
average min max
1 var8 0.026567 0.026069 0.027204
2 var7 0.192424 0.190171 0.193983
3 var3 0.377138 0.371293 0.384058
4 var2 0.933870 0.931780 0.936487
5 var1 1.130904 1.126566 1.141807
6 var9 1.166317 1.150050 1.172436
7 var4 1.516546 1.510337 1.525137
8 var10 2.116518 2.085666 2.135315
9 var6 2.488669 2.479040 2.502971
10 var5 4.465629 4.457348 4.473298
~10240Kb, символы 10485820 ascii, случайно пробелов ~ 0.198%, сред длина слова:502.932141
by :
average min max
1 var8 0.007237 0.006813 0.007651
2 var7 0.016183 0.015791 0.016414
3 var3 0.030802 0.029833 0.031738
4 var2 0.468537 0.457903 0.477776
5 var1 1.375179 1.357010 1.388190
6 var9 1.879247 1.867879 1.896920
7 var4 2.016457 1.990694 2.060548
8 var6 2.413361 2.397260 2.420363
9 var10 3.465412 3.430199 3.499782
10 var5 4.380763 4.351999 4.431059
--------------------
1 место var8 - 240 баллов
2 место var7 - 216 баллов
3 место var3 - 192 баллов
4 место var2 - 168 баллов
5 место var1 - 143 баллов
6 место var9 - 121 баллов
7 место var4 - 96 баллов
8 место var6 - 66 баллов
9 место var10 - 54 баллов
10 место var5 - 24 баллов
Ответ 4
В лоб:
len = 0
s = '99 99 99 99'
for с in s:
if с != ' ':
len += 1
print len
8
Функционально-извращенно:
s = '99 99 99 99'
print sum(map(lambda c: int(not(c == ' ')) , s))
8
или
sum(map(lambda c: 1 if c != ' ' else 0, s))