Python Как вставить символы в любой другой элемент в списке - PullRequest
0 голосов
/ 21 января 2020
list = ['username1', 'https://link.com/bsd3nj', 'username2', 'https://link.com/a32fs2', 'username3', 'https://link.com/cfzxso']

sort_list = '* {}'.format('- \n'.join(list))

Вывод:

* username1- 
https://link.com/bsd3nj-
username2- 
https://link.com/a32fs2-
username3- 
https://link.com/cfzxso-
username4- 
https://link.com/a235jsh-
username5- 
https://link.com/123nls2-

Это то, что у меня есть, но это не то, чего я хочу.

Я хочу, чтобы список был похож на

* username1 - https://link.com/bsd3nj
* username2 - https://link.com/a32fs2
* username3 - https://link.com/cfzxso
* username4 - https://link.com/a235jsh
* username5 - https://link.com/123nls2

Я думал о том, чтобы сделать .split(), но на самом деле не существует никакого паттерна. Имя пользователя является случайным, поэтому ссылка заканчивается.

Ответы [ 5 ]

2 голосов
/ 21 января 2020

Вы не должны использовать встроенное имя для переменной: list, это избавит вас от ошибок в день, если вы не думаете об этом


Тем не менее, Для создания пар из последовательных элементов есть несколько вариантов (, перечисленных здесь )

Вот один из них: zip(values[::2], values[1::2])

for name, link in zip(values[::2], values[1::2]):
    print(f"*{name} - {link}")

# or shorter

sort_list = "\n".join([f"*{name} - {link}" for name, link in zip(values[::2], values[1::2])])
print(sort_list, "\n\n")

Обозначение среза [start:end:increment] здесь

  • [::2]: все значения от начала, 2 на 2 => все имена
  • [1::2]: все значения, кроме первого, 2 на 2 => все ссылки

Операция zip создает итератор, который агрегирует элементы из каждого из повторяемых элементов.

zip([1,2,3], ['a', 'b', 'c']) # => ((1,'a'), (2, 'b'), ('3, 'c'))

Итак, у вас есть список имен и список ссылок, и вы их пару

print(values[::2])  # ['username1', 'username2', 'username3']
print(values[1::2])  # ['https://link.com/bsd3nj', 'https://link.com/a32fs2', 'https://link.com/cfzxso']
print(list(zip(values[::2], values[1::2]))) # [('username1', 'https://link.com/bsd3nj'), ('username2', 'https://link.com/a32fs2'), ('username3', 'https://link.com/cfzxso')]
1 голос
/ 21 января 2020

Здесь как однострочный:

l = ['username1', 'https://link.com/bsd3nj', 'username2', 'https://link.com/a32fs2', 'username3', 'https://link.com/cfzxso']

out = '* {}'.format('\n* '.join(list(map(" - ".join, zip(l[::2], l[1::2])))))
1 голос
/ 21 января 2020

Использование итератора является эффективным решением:

def joined(given_list):
    iterator = iter(given_list)
    return '\n'.join(['* ' + c + ' - ' + next(iterator) for c in iterator])
0 голосов
/ 21 января 2020

Добавьте некоторую структуру к вашим данным по мере их создания, или здесь я добавлю это позже:

L = [
    'username1', 'https://link.com/bsd3nj',
    'username2', 'https://link.com/a32fs2',
    'username3', 'https://link.com/cfzxso',
    ]
it = iter(L)
L = [(a, b) for a, b in zip(it, it)]

Затем используйте эту структуру для руководства тем, что вы создаете:

S = "".join(f"* {username} - {url}\n" for username, url in L)
0 голосов
/ 21 января 2020

Мне нравится использовать numpy и pandas.

import numpy as np 
import pandas as pd 

l = ['username1', 'https://link.com/bsd3nj', 'username2', 'https://link.com/a32fs2', 'username3', 'https://link.com/cfzxso']

l = np.array(l)  # convert to numpy array so I can reshape it into two column
l = l.reshape(-1,2)
l = pd.DataFrame(l) # convert to data frame so I can easily use operator.

l = "*  " + l[0] +  " - " + l[1]
l = l.values.tolist()  # convert back to list
l = "\n".join(l) # convert to string with line break.
print(l)

Вывод:

*  username1 - https://link.com/bsd3nj
*  username2 - https://link.com/a32fs2
*  username3 - https://link.com/cfzxso
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...