我有两个列表
copy_from = ['2.02,1.91', '1.9,2.06', '1.86,1.98']
copy_to = [('-0.25', '2.02,1.91'), ('-1.50', '1.9,2.06')]
最终结果应为:
fixed = [('-0.25', '2.02,1.91', '2.02,1.91'), ('-1.50', '1.9,2.06', '1.86,1.98')]
我想做的就是从每个元组中获取第二项(列表copy_to
),例如。 '2.02,1.91'
并在列表copy_from
中查看其位置。在我们对其进行本地化后,我想从列表copy_from
('1.9,2.06'
)中获取下一个项目,然后将其复制回列表copy_to
中的批准元组。但是,copy_from
有时会遗漏批准的 next 项。这是copy_to'
元组项目是copy_from
中的邻居。而在上面他们是。
如果是这种情况,我不能使用 next 项,我必须重复项目(如fixed
第一元组中所示)。如果没有邻居,就像这样:
copy_from = ['2.02,1.91', '2, 1.89', '1.9,2.06', '1.86,1.98']
copy_to = [('-0.25', '2.02,1.91'), ('-1.50', '1.9,2.06')]
然后结果应该是:
fixed = [('-0.25', '2.02,1.91', '2, 1.89'), ('-1.50', '1.9,2.06', '1.86,1.98')]
将有两个 - 相邻和不相邻的项目。
我知道这个解释让人感到困惑,希望你能理解我的来源。我知道,这是一项复杂的任务,所以任何提示,比如在哪里看,哪个库可能也很有用!
答案 0 :(得分:2)
你的问题很混乱,很困惑。但我认为无论你的实际问题是什么,你的第一步应该是创建一个dict
。当你的问题是“我需要查找一个键并获得相应的值,或者如果它不存在时获得一些默认值”,答案通常是dict.get
。
例如,您可以创建dict
将copy_from
的每个成员映射到其后续成员:
copy_from = ['2.02,1.91', '1.9,2.06', '1.86,1.98']
dict_from = dict(zip(copy_from, copy_from[1:]))
现在,要获取copy_from
中任何值的下一个值,或者键本身(如果不存在):
value = dict_from.get(value, value)
特别是:
>>> v = '1.9,2.06'
>>> dict_from.get(v, v)
'1.86,1.98'
>>> v = '1.86,1.98'
>>> dict_from.get(v, v)
'1.86,1.98'
我认为至少在你想要的路上?
答案 1 :(得分:1)
这很糟糕......但我认为这可以满足您的需求......但是根据所有评论清理您的输入!
copy_from = ['2.02,1.91', '1.9,2.06', '1.86,1.98']
copy_to = [('-0.25', '2.02,1.91'), ('-1.50', '1.9,2.06')]
fixed = []
for ct in copy_to:
if ct[1] in copy_from:
idx = copy_from.index(ct[1])
if idx < len(copy_from):
ct += (copy_from[idx+1], )
else:
ct += (copy_from[idx], )
fixed.append(ct)
答案 2 :(得分:1)
检查一下:
>>> result=[]
>>> copy_from_max_idx = len(copy_from) -1
>>> copy_to_max_idx = len(copy_to)-1
>>> for i,e in enumerate(copy_to):
try:
idx = copy_from.index(e[1])
except:
idx = -1
if idx >=0:
#check neighbours (next item actually)
next_copy_from = e[1] if idx >= copy_from_max_idx else copy_from[idx + 1]
next_copy_to = '' if i >= copy_to_max_idx else copy_to[i+1][1]
if next_copy_to == next_copy_from:
result.append(e + (e[1],))
else:
result.append(e + (next_copy_from,))
答案 3 :(得分:1)
首先到目的地列表是一个元组列表,一个元组是不可变的,所以我不得不做一个棘手的转换到列表列表。
这就是我提出的:
def doStuff(ref, dest):
tmp = [list(x) for x in dest]
search_keys = [l[1] for l in tmp]
ref_pairs = [ref[n:n+2] for n in range(0, len(ref), 1) if len(ref[n:n+2]) > 1]
dest_pairs = [search_keys[n:n+2] for n in range(0, len(search_keys), 1)]
for index,pair in enumerate(dest_pairs):
if pair in ref_pairs:
tmp[index].append(pair[0])
else:
candidate_pair = [p for p in ref_pairs if p[0] == pair[0]]
if candidate_pair:
tmp[index].append(candidate_pair[0][1])
else:
tmp[index].append(None)
return [tuple(l) for l in tmp]
# Test case 1
copy_from = ['2.02,1.91', '1.9,2.06', '1.86,1.98']
copy_to = [('-0.25', '2.02,1.91'), ('-1.50', '1.9,2.06')]
copy_to = doStuff(copy_from, copy_to)
print 'Case1:\n', copy_to
# Test case 2
copy_from = ['2.02,1.91', '2, 1.89', '1.9,2.06', '1.86,1.98']
copy_to = [('-0.25', '2.02,1.91'), ('-1.50', '1.9,2.06')]
copy_to = doStuff(copy_from, copy_to)
print 'Case2:\n', copy_to
# Test case 3
copy_from = ['2.02,1.91', '2, 1.89', '1.9,2.06']
copy_to = [('-0.25', '2.02,1.91'), ('-1.50', '1.9,2.06')]
copy_to = doStuff(copy_from, copy_to)
print 'Case3:\n', copy_to
输出3个测试用例:
Case1:
[('-0.25', '2.02,1.91', '2.02,1.91'), ('-1.50', '1.9,2.06', '1.86,1.98')]
Case2:
[('-0.25', '2.02,1.91', '2, 1.89'), ('-1.50', '1.9,2.06', '1.86,1.98')]
Case3:
[('-0.25', '2.02,1.91', '2, 1.89'), ('-1.50', '1.9,2.06', None)]