我有两个名为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列表是一个包含许多元素的大型列表,基本列表通常是三个或四个元素长,仅用于转换为新列表。
答案 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模块)来提取数字和路径以及更换数字时。
此代码在迭代时也会更改列表,这可能不是最诡计多端的事情。