/ / Krájanie reťazcov vety so stupnicou - krajta, reťazec, krajta-3.x, rez

Krájanie reťazcov vety s mierkou - python, string, python-3.x, slice

Potrebujem teda pre toto zadanie vytvoriť 3 funkcie. Prvý by mal urobiť nasledovné

numCol ():Pri práci s obyčajným textom (a s údajmi napísanými ako obyčajný text) môže byť užitočné mať „mierku“, ktorá označuje stĺpce, v ktorých sa znaky vyskytujú. Vytvoríme mierku pomocou dvoch línií (alebo „riadkov“). V druhom riadku opakovane tlačíme 1234567890. Do prvého riadku (tj. Riadok nad druhým riadkom) napíšeme „nuly“ číslice nad nuly do druhého riadku, ako je uvedené v zozname nižšie. Táto funkcia trvá jeden argument, celé číslo a vytlačí mierku po celej dĺžke vašej ponuky. Nič nevracia.

Druhý by mal

docQuote (): Berie tri argumenty: 1) citát ako reťazec, 2) začiatočná hodnota rezu a 3) koncová hodnota rezu. Vráti upravenú šnúru.

Tretí by mal

main (): Neberie žiadne argumenty a nič nevracia.Vyzve používateľa na pôvodnú ponuku a číslo potrebných plátkov. Potom v cykle for zavolá numCol () takým spôsobom, že mierka je dĺžkou ponuky, vyzve používateľa na začiatočné a koncové hodnoty rezu (pripomeňme, že koncová hodnota nie je zahrnutá do rezu), a potom zavolá docQuote (). Na záver sa vytlačí konečný upravený citát.

Ak je program správny, jeho výstup by mal vyzerať takto:

1.  Enter quote: Money is the root of all evil.
2.  Enter the number of slices needed: 2
3.  1 2
4.  012345678901234567890123456789
5.  Money is the root of all evil.
6.  Start and end for slicing separated by a comma: 8, 20
7.  1
8.  012345678901234567
9.  Money is all evil.
10. Start and end for slicing separated by a comma: 12, 17
11. -> Money is all.

Čo zatiaľ mám: (Aktualizuje sa, ak na niečo prídem)

def numCol(x):
col=[]
for i in range(1,(round(n)//10)+1):
col.append(str(i))
print("         ","         ".join(col),end="")


def docQuote(x,y,z):
return

def main():
x=input("Enter quote: ")
y=int(input("Enter the number of slices needed: "))
numCol(len(x)-1)
print(x)

main()

odpovede:

2 pre odpoveď č. 1

Dobre: ​​musíte definovať funkciu s názvom numCol ktorý má jeden celočíselný argument:

def numCol(n):

potom musíte vytlačiť riadok pozostávajúci z n znaky, kde každý desiaty znak je prírastkové celé číslo a každý ďalší znak je medzera.

    chars = []
for i in range(1, n+1):
if i % 10:
chars.append(" ")
else:
chars.append(str((i % 100) // 10))
print("".join(chars))

a nakoniec riadok pozostávajúci z písmen „n“, ktoré opakujú 1234567890:

    chars = []
for i in range(1, n+1):
chars.append(str(i % 10))
print("".join(chars))

ktorý potom beží ako

>>> numCol(65)
1         2         3         4         5         6
12345678901234567890123456789012345678901234567890123456789012345

editovať:

V reakcii na @AdamSmith:

Pozrime sa na niektoré skutočné čísla:

from textwrap import dedent
from timeit import Timer

test_statements = [
(
"n = 65",
"""
# as a for-loop
chars = []
for i in xrange(1, n+1):
if i % 10:
chars.append(" ")
else:
chars.append(str((i % 100) // 10))
"""
),
(
"n = 65",
"""
# as a list comprehension
chars = [" " if i%10 else str((i%100)//10) for i in xrange(1,n+1)]
"""
),
(
"n = 65",
"""
# extra cost of list-to-string
chars = [" " if i%10 else str((i%100)//10) for i in xrange(1,n+1)]
s = "".join(chars)
"""
),
(
"n = 65",
"""
# vs cost of generator-to-string
chars = (" " if i%10 else str((i%100)//10) for i in xrange(1,n+1))
s = "".join(chars)
"""
),
(
"s = "         1         2         3         4         5         6     "",
"""
# cost of actually displaying string
print(s)
"""
)
]

for setup,run in test_statements:
res   = Timer(dedent(run), setup)
times = res.repeat()   # 3 * 1000000 runs
print("{:7.1f}".format(min(times))   # time of one loop in microseconds

v mojom systéme (i5-760, Win7 x64, Python 2.7.5 64bit) to dáva

   15.1   # for-loop -> list of chars
10.7   # list comprehension -> list of chars
11.4   # list comprehension -> string
13.6   # generator expression -> string
132.1   # print the string

záver:

  • porozumenie zoznamu je o 29% rýchlejšie ako cyklus for-loop pri zostavovaní zoznamu znakov

  • výraz generátora je 19,6% pomalšie než porozumenie zoznamu pri zostavovaní zoznamu znakov a pripojení k reťazcu

  • je to pekne irelevantné, pretože skutočná tlač výstupu trvá 9-krát dlhšie ako jeho generovanie pomocou programu akýkoľvek z týchto metód - v čase, keď reťazec vytlačíte, je použitie porozumenia zoznamu (najrýchlejšie) iba o 2,9% rýchlejšie ako cyklu for-loop (najpomalšie).


@ user3482104

Ak sa naozaj chcete vyhnúť if ... else, môžete robiť

if stmt:
do_a()
if not stmt:    # same effect as "else:"
do_b()

ale uvedomte si, že to treba vyhodnotiť stmt dvakrát kde else hodnotí to iba raz.

Pretože obe slučky iterujú v rovnakom rozsahu (rovnaké počiatočné a koncové hodnoty), môžete tieto slučky kombinovať:

def numCol(n):
firstline  = []
secondline = []

for i in range(1, n+1):
i %= 100
tens, ones = i // 10, i % 10
if ones:        # ones != 0
firstline.append(" ")
if not ones:    # ones == 0    # <= "else:"
firstline.append(str(tens))
secondline.append(str(ones))

print("".join(firstline))
print("".join(secondline))