/ / Нарязване на низове на изречение с мащаб - python, string, python-3.x, slice

Изрязване на низове на изречение с мащаб - питън, низ, python-3.x, парче

Затова трябва да създам 3 функции за това задание. Първият трябва да направи следното

numCol (): Когато се занимава с обикновен текст (и данни, написани с обикновен текст), може да бъде полезно да имате "скала", която показва колоните, в които се появяват знаци. Създаваме мащаб с помощта на два реда (или „редове“). Във втория ред отпечатваме 1234567890 многократно. В първия ред (т.е. реда над втория ред) пишем цифрите „десетки“ над нулите на втория ред, както е показано в списъка по-долу. Тази функция взема един аргумент, цяло число и отпечатва мащаб дължината на вашия цитат. Не връща нищо.

Вторият трябва

docQuote (): Взема три аргумента: 1) цитата като низ, 2) началната стойност на среза и 3) крайната стойност на среза. Той връща докторирания низ.

Третият трябва

main (): Не взема аргументи и не връща нищо. Подканва потребителя за оригинална оферта и номер от необходимите филийки. След това в for-loop извиква numCol () по такъв начин, че мащабът е дължината на цитата, подканва потребителя за стойностите на началния и крайния отрязък (припомнете, че крайната стойност не е включена в среза), и след това извиква docQuote (). И накрая, тя отпечатва окончателния докторантиран цитат.

Ако програмата е правилна, нейният изход трябва да изглежда по следния начин:

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.

Какво имам досега: (Ще актуализирам, ако разбера нещо)

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()

Отговори:

2 за отговор № 1

Добре: трябва да дефинирате наречена функция numCol което взема един цяло число аргумент:

def numCol(n):

тогава трябва да отпечатате ред, състоящ се от n символи, където всеки десети знак е нарастващо цяло число, а всеки друг символ е интервал.

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

и накрая ред, състоящ се от „n“ символи, като 1234567890 повтаря:

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

която след това работи като

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

редактиране:

В отговор на @AdamSmith:

Нека видим някои действителни числа:

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

на моята система (i5-760, Win7 x64, Python 2.7.5 64bit) това дава

   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

Изводи:

  • разбирането на списъка е с 29% по-бързо от формиращия цикъл при съставяне на списък от знаци

  • израз на генератор е 19.6% по-бавно отколкото разбиране на списък при съставяне на списък от знаци и присъединяване към низ

  • това е доста неуместен, защото всъщност отпечатването на изхода отнема 9 пъти повече от генерирането му който и да е от тези методи - до момента, в който отпечатате низа, използването на разбиране на списъка (най-бързо) е само с 2,9% по-бързо от for-loop (най-бавно).


@ user3482104

Ако наистина искате да се избегне if ... else, можете да направите

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

но имайте предвид, че това трябва да оцените stmt два пъти къде else оценява го само веднъж.

Също така, тъй като и двете цикли се повтарят в един и същ диапазон (едни и същи начални / крайни стойности), можете да комбинирате контурите:

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))