Страницы

Поиск по вопросам

среда, 11 декабря 2019 г.

Python, длина строки без учета пробелов

#python


Как можно на 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))

Комментариев нет:

Отправить комментарий