Какой самый эффективный способ перебора, манипулируя списком или строкой? - PullRequest
1 голос
/ 03 апреля 2020

Моя цель - создать взломщик кода в python. До сих пор я перемешал буквы и в результате получил список отдельных символов.

#Result of inputting the string 'hello world'
['C', 'V', 'N', 'N', 'H', 'X', 'H', 'K', 'N', 'O']

Моя цель - вывести это как строку с пробелом 'CVNNH XHKNO'

Теперь у меня есть несколько вариантов, но я не уверен, какой из них будет лучшим: сначала преобразовать его в строку перед тем, как манипулировать им, либо манипулировать списком перед преобразованием в строку.

I пока что у вас доступны следующие помощники (автоматически)

length = [5,5] #list
total_chars = 10 #int
no_of_words = 2 #int

Я преобразовал его в строку CVNNHXHKNO и подумал о вставке пробела после 5-й буквы путем вычисления начальной точки [0], середина точка [5] и конечная точка [11].

start = 0
mid_point = total_chars - length[0]

print(mid_point)
first_word = message[start:mid_point]
print(first_word)

second_word = message[mid_point:total_chars]
print(second_word)

completed_word = first_word + ' ' + second_word
print(completed_word)

К сожалению, это просто вручную и не учитывает наличие 5 или более слов. Я попытался перебрать исходный список отдельных символов во вложенных циклах for, используя длину списка, но, похоже, я запутался и задумался.

Ответы [ 5 ]

2 голосов
/ 03 апреля 2020

Я не до конца понимаю ваш вопрос, но, вероятно, вам нужно что-то вроде

letters = ['C', 'V', 'N', 'N', 'H', 'X', 'H', 'K', 'N', 'O']
length = [5, 5]
words = []
offset = 0

for i in length:
    words.append(''.join(letters[offset:offset+i]))
    offset += i   

string_words = ' '.join(words)
print(string_words)
2 голосов
/ 03 апреля 2020

Если у вас есть это в качестве входных данных:

l = ['C', 'V', 'N', 'N', 'H', 'X', 'H', 'K', 'N', 'O']
length = [5,5] #list
total_chars = 10 #int
no_of_words = 2 #int

Затем вы можете вычислить ваш вывод следующим образом:

words = []
pos = 0
for i in length:
  words.append("".join(l[pos:pos+i]))
  pos += i

result = " ".join(words)

print(words)
print(result)

Выход:

['CVNNH', 'XHKNO']
CVNNH XHKNO
1 голос
/ 03 апреля 2020

Похоже, вам просто нужен список length, описывающий количество букв в каждом слове:

message = ['C', 'V', 'N', 'N', 'H', 'X', 'H', 'K', 'N', 'O']

length = [5,5]

offset = 0
words = []
for size in length:
    words.append(''.join(message[offset:offset+size]))
    offset += size
completed_word = ' '.join(words)

print(completed_word)

Вывод:

CVNNH XHKNO
1 голос
/ 03 апреля 2020

Чтобы иметь возможность использовать бесконечно длинные списки длин в качестве входных данных, вы можете перебрать список length и объединить соответствующие буквы:

letters = ["A", "S", "I", "M", "P", "L", "E", "T", "E", "S", "T"]
length = [1, 6, 4]

starting_index = 0
for l in length:
    print("".join(letters[starting_index:starting_index+l]))
    starting_index += l
1 голос
/ 03 апреля 2020
lst = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']

WORD_SIZE = 5
NUM_WORDS = 2  # You could replace this with `len(lst) / WORD_SIZE`
result = ' '.join(
  ''.join(
    lst[i * WORD_SIZE: i * WORD_SIZE + 5]
  )
  for i in range(NUM_WORDS)
)

#  result = 'abcde fghij'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...