파이썬에서 동일한 문자열을 문자열 목록에 추가


183

하나의 문자열을 가져 와서 목록에 포함 된 모든 문자열에 추가 한 다음 완성 된 문자열이있는 새 목록을 만들려고합니다. 예:

list = ['foo', 'fob', 'faz', 'funk']
string = 'bar'

*magic*

list2 = ['foobar', 'fobbar', 'fazbar', 'funkbar']

루프를 시도하고 목록 이해를 시도했지만 쓰레기였습니다. 언제나 그렇듯이 도움을 주시면 감사하겠습니다.


25
list내장이기 때문에 할당하는 것이 현명하지 않습니다 .
Noufal Ibrahim

답변:


315

이를 수행하는 가장 간단한 방법은 목록 이해입니다.

[s + mystring for s in mylist]

내장 이름을 사용 list하지 않는 것이 좋습니다. 내장 이름을 숨기거나 숨기므로 그다지 좋지 않습니다.

또한 실제로 목록이 필요하지 않고 반복자가 필요한 경우 생성기 표현식이 더 효율적일 수 있습니다 (짧은 목록에서는 중요하지 않음).

(s + mystring for s in mylist)

이것들은 매우 강력하고 유연하며 간결합니다. 모든 훌륭한 파이썬 프로그래머는 그것들을 사용하는 법을 배워야합니다.


8
또는 게으른 게 원하는 경우 genexp(s + mystring for s in mylist)
Noufal Ibrahim

그것은 당신이 그것에 대한 좋은 튜토리얼을 알고 있다면, 분명히 이해를 많이하고, 감사합니다. 목록의 각 항목 앞에는 u '가 있으며 유니 코드의 경우입니까?
Kevin

3
@Kevin, 여기 유니 코드 문자열에 대한 튜토리얼이 있습니다. docs.python.org/tutorial/introduction.html#tut-unicodestrings
tgray

목록에서 색인이 필요한 경우 다음을 수행 할 수 있습니다["{}) {}".format(i, s) for i, s in enumerate(mylist)]
Vapid Linus

1
참고 사항 : "s"앞에 "mystring"을 추가하지 않고 "s"앞에 추가하면 "s"의 시작 부분에 "mystring"이 연결됩니다. 같은 list2 = ["mystring" + s for s in mylist]=list2 = ['barfoo', 'barfob', 'barfaz', 'barfunk']
폴 Tuckett

25
my_list = ['foo', 'fob', 'faz', 'funk']
string = 'bar'
my_new_list = [x + string for x in my_list]
print my_new_list

인쇄됩니다 :

['foobar', 'fobbar', 'fazbar', 'funkbar']

5

map 나에게 맞는 작업 도구 인 것 같습니다.

my_list = ['foo', 'fob', 'faz', 'funk']
string = 'bar'
list2 = list(map(lambda orig_string: orig_string + string, my_list))

에 대한 자세한 예는 기능 프로그래밍 도구에 대한 이 섹션 을 참조하십시오 map.


2

pythonic 방식으로 다음 실험을 실행하십시오.

[s + mystring for s in mylist]

다음과 같이 for 루프를 사용하는 것보다 ~ 35 % 빠릅니다.

i = 0
for s in mylist:
    mylist[i] = s+mystring
    i = i + 1

실험

import random
import string
import time

mystring = '/test/'

l = []
ref_list = []

for i in xrange( 10**6 ):
    ref_list.append( ''.join(random.choice(string.ascii_lowercase) for i in range(10)) )

for numOfElements in [5, 10, 15 ]:

    l = ref_list*numOfElements
    print 'Number of elements:', len(l)

    l1 = list( l )
    l2 = list( l )

    # Method A
    start_time = time.time()
    l2 = [s + mystring for s in l2]
    stop_time = time.time()
    dt1 = stop_time - start_time
    del l2
    #~ print "Method A: %s seconds" % (dt1)

    # Method B
    start_time = time.time()
    i = 0
    for s in l1:
        l1[i] = s+mystring
        i = i + 1
    stop_time = time.time()
    dt0 = stop_time - start_time
    del l1
    del l
    #~ print "Method B: %s seconds" % (dt0)

    print 'Method A is %.1f%% faster than Method B' % ((1 - dt1/dt0)*100)

결과

Number of elements: 5000000
Method A is 38.4% faster than Method B
Number of elements: 10000000
Method A is 33.8% faster than Method B
Number of elements: 15000000
Method A is 35.5% faster than Method B

2

"문자열 목록에 문자열 목록 추가"로 비트 확장 :

    import numpy as np
    lst1 = ['a','b','c','d','e']
    lst2 = ['1','2','3','4','5']

    at = np.full(fill_value='@',shape=len(lst1),dtype=object) #optional third list
    result = np.array(lst1,dtype=object)+at+np.array(lst2,dtype=object)

결과:

array(['a@1', 'b@2', 'c@3', 'd@4', 'e@5'], dtype=object)

dtype odject가 더 변환 될 수 있습니다 str


업데이트 : 같은 기호를 여러 번 복사하지 at = np.full(fill_value='@',shape=1,dtype=object)at = np.array("@", dtype=object)
않아도됩니다

1

파이썬에서 map 안에 람다를 사용할 수 있습니다. 회색 코드 생성기를 썼습니다. https://github.com/rdm750/rdm750.github.io/blob/master/python/gray_code_generator.py # 당신의 코드는 여기에 ''n-1 비트 코드 '', 각 단어 앞에 0이 붙고 '' n-1 비트 코드는 역순으로, 각 단어 앞에 1이 붙습니다. '' '

    def graycode(n):
        if n==1:
            return ['0','1']
        else:
            nbit=map(lambda x:'0'+x,graycode(n-1))+map(lambda x:'1'+x,graycode(n-1)[::-1])
            return nbit

    for i in xrange(1,7):
        print map(int,graycode(i))

1

더 많은 옵션으로 업데이트

list1 = ['foo', 'fob', 'faz', 'funk']
addstring = 'bar'
for index, value in enumerate(list1):
    list1[index] = addstring + value #this will prepend the string
    #list1[index] = value + addstring this will append the string

키워드를 'list'와 같은 변수로 사용하지 말고 이름을 'list'로 'list1'로 바꾸십시오.


이것은 좋은 제안입니다. 또 다른 방법은 문자열을 추가하는 함수와 함께 array_map을 사용하는 것입니다 ... php.net/manual/en/function.array-map.php
ROunofF

1

다음을 사용하는 간단한 답변이 pandas있습니다.

import pandas as pd
list1 = ['foo', 'fob', 'faz', 'funk']
string = 'bar'

list2 = (pd.Series(list1) + string).tolist()
list2
# ['foobar', 'fobbar', 'fazbar', 'funkbar']

변수 이름을 목록 및 문자열에서 다른 것으로 변경하십시오. 리스트는 내장 된 파이썬 타입입니다
sagi

0
list2 = ['%sbar' % (x,) for x in list]

그리고 list이름으로 사용하지 마십시오 . 내장 유형을 음영 처리합니다.


'%sbar' % (x,)대신에 '%sbar' % x? 왜 안돼 x + 'bar'?
John Machin

1
x가 튜플이면 두 번째는 실패합니다. 분명히 모든 요소를 ​​문자열로 만들 계획 이지만 때로는 문제가 발생합니다. 첫 번째와 세 번째의 차이점은 외부 소스에서 문자열을 얻지 않는 한 대부분 맛입니다.
Ignacio Vazquez-Abrams

2
'예외 발생'! = '실패'. 잘못된 데이터 유형이 있으면 이미 실패한 것입니다. 내가 선호하는 표현은 실패를 강조하는 예외를 일으킨다. 선호하는 표현은 자동으로 쓰레기를 생성합니다. 맛 : 바로크식이 내 취향에 맞지 않습니다.
John Machin

0
new_list = [word_in_list + end_string for word_in_list in old_list]

변수 이름에 "list"와 같은 이름을 사용하면 내장을 덮어 쓰거나 덮어 쓰기 때문에 잘못됩니다.


0

만일을 위해서

list = ['foo', 'fob', 'faz', 'funk']
string = 'bar'
for i in range(len(list)):
    list[i] += string
print(list)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.