Python:如果满足条件,则将一个列表的元素替换为另一个列表的元素

时间:2015-11-17 15:12:33

标签: python list conditional

我有两个名为src的列表,每个元素都采用以下格式:

timeoutId

以这种格式的每个元素称为base:

['SOURCE:  filename.dc : 1 : a/path/: description','...]

我试图将基本元素的数字(在本例中为4)与源元素的数字进行比较(在这种情况下,它是#1)。

如果匹配,那么我想用基本元素的路径替换源元素的数字。

现在我可以用这样的for循环分割源元素的数字:

['BASE: 1: another/path','...]

我可以用这样的for循环分割基本元素的路径和数字:

    for w in source_list:
      src_no=(map(lambda s: s.strip(), w.split(':'))[2])

我希望新列表看起来像(基于上面两个元素的例子):

        for r in basepaths:
          base_no=(map(lambda s: s.strip(), r.split(':'))[1])
          base_path=(map(lambda s: s.strip(), r.split(':'))[2])

src列表是一个包含许多元素的大型列表,基本列表通常是三个或四个元素长,仅用于转换为新列表。

5 个答案:

答案 0 :(得分:0)

因此,有一个大型列表将被顺序浏览,而一个较短的列表。我会把短的一个变成一个映射,以便立即找到第一个列表中的每个项目是否匹配:

base = {}
for r in basepaths:
    base_no=(map(lambda s: s.strip(), r.split(':'))[1])
    base_path=(map(lambda s: s.strip(), r.split(':'))[2])
    base[base_no] = base_path
for w in enumerate source_list:
    src_no=(map(lambda s: s.strip(), w.split(':'))[2])
    if src_no in base:
        path = base[src_no]
        # stuff...

答案 1 :(得分:0)

这样的事情:

for i in range(len(source_list)):
    for b in basepaths:
        if source_list[i].split(":")[2].strip() == b.split(":")[1].strip():
            source_list[i] = ":".join(source_list[i].split(":")[:3] + [b.split(":")[2]] + source_list[i].split(":")[4:])

答案 2 :(得分:0)

只是摆脱了分裂的[]部分:

src=(map(lambda s: s.strip(), w.split(':')))
base=(map(lambda s: s.strip(), r.split(':')))

>> src
>> ['SOURCE', 'filename.dc', '1', 'a/path/', 'description']

基数同样是一个简单的列表 现在只需替换​​正确的元素:

src[2] = base[2]

然后在必要时将元素重新组合在一起:

src = ' : '.join(src)

答案 3 :(得分:0)

def separate(x, separator = ':'):
    return tuple(x.split(separator))

sourceList = map(separate, source)

baseDict = {}
for b in map(separate, base):
    baseDict[int(b[1])] = b[2]


def tryFind(number):
    try:
        return baseDict[number]
    except:
        return number


result = [(s[0], s[1], tryFind(int(s[2])), s[3]) for s in sourceList]

这对我有用,它不是最好的,而是一个开始

答案 4 :(得分:0)

我为你一起砍了一些东西,我觉得应该做你想做的事情:

base_list = ['BASE: 1: another/path']
base_dict = dict()

# First map the base numbers to the paths
for entry in base_list:
    n, p = map(lambda s: s.strip(), entry.split(':')[1:])
    base_dict[n] = p

source_list = ['SOURCE:  filename.dc : 1 : a/path/: description']

# Loop over all source entries and replace the number with the base path of the numbers match   
for i, entry in enumerate(source_list):
    n = entry.split(':')[2].strip()
    if n in base_dict:
        new_entry = entry.split(':')
        new_entry[2] = base_dict[n]
        source_list[i] = ':'.join(new_entry)

请注意,这是一个hacky解决方案,我认为您应该使用regexp(查看re模块)来提取数字和路径以及更换数字时。

此代码在迭代时也会更改列表,这可能不是最诡计多端的事情。