将相同的字符串附加到Python中的字符串列表中

时间:2010-01-12 16:50:17

标签: python list

我正在尝试获取一个字符串,并将其附加到列表中包含的每个字符串,然后使用已完成的字符串创建一个新列表。例如:

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

*magic*

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

我尝试了循环,尝试了列表理解,但这是垃圾。一如往常,任何帮助,非常感谢。

13 个答案:

答案 0 :(得分:231)

最简单的方法是使用列表理解:

[s + mystring for s in mylist]

请注意,我避免使用像list这样的内置名称,因为它隐藏或隐藏了内置名称,这非常不好。

此外,如果您实际上不需要列表,但只需要一个迭代器,则生成器表达式可以更有效(尽管它在短列表中可能不重要):

(s + mystring for s in mylist)

这些功能非常强大,灵活且简洁。每个优秀的python程序员都应该学会使用它们。

答案 1 :(得分:20)

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']

答案 2 :(得分:2)

到目前为止,我还没有找到一种评论答案的方法。所以这就是。 我支持Ignacio Vazquez-Abrams对list2 = ['%sbar' % x for x in list]的回答。

使用[string + "bar" for string in list]的其他答案大部分时间都可以使用,但是如果你接受一个更通用的解决方案来处理最简单的情况,你就是 - 恕我直言 - 遵循Python设计原则。应该最好有一种明显的方法来做到这一点。 %sbar始终有效。

答案 3 :(得分:2)

map对我来说似乎是正确的工具。

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

有关map的更多示例,请参阅有关函数式编程工具的this section

答案 4 :(得分: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

答案 5 :(得分: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对象可以进一步转换为str

答案 6 :(得分: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

避免将关键字用作“列表”之类的变量,而将“列表”重命名为“ list1”

答案 7 :(得分:0)

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

不要使用list作为名称;它会影响内置类型。

答案 8 :(得分:0)

new_list = [word_in_list + end_string for word_in_list in old_list]

使用诸如“list”之类的名称作为变量名是很糟糕的,因为它会覆盖/覆盖内置函数。

答案 9 :(得分:0)

你可以在python中使用lambda里面的map。写了一个灰色代码生成器。 https://github.com/rdm750/rdm750.github.io/blob/master/python/gray_code_generator.py         #你的代码就在这里         &#39;&#39;&#39;         n-1位代码,每个字前面加0,后跟         n-1位代码以相反的顺序排列,每个字前面加1。         &#39;&#39;&#39;

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

答案 10 :(得分:0)

这是使用pandas的简单答案。

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

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

答案 11 :(得分:0)

以防万一

#include <Windows.h>
#include <stdio.h>

LRESULT CALLBACK wndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevinstance, PSTR szCmdLine, int iCmdShow) {
    HWND hwnd;
    //...

    DWORD threadID = GetWindowThreadProcessId(hwnd, NULL);
    HINSTANCE hinstDLL = LoadLibrary(TEXT("..\\Debug\\ProcHookDLL.dll"));
    void (*AttachHookProc)(DWORD);
    AttachHookProc = (void (*)(DWORD)) GetProcAddress(hinstDLL, "AttachHook");
    AttachHookProc(threadID);

    MSG msg = {};

    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
    //...
};

答案 12 :(得分:0)

结合 mapformat

>>> list(map('{0}bar'.format,  ['foo', 'fob', 'faz', 'funk']))
['foobar', 'fobbar', 'fazbar', 'funkbar']