我有这样的价值观。
col1 col2 col3
17.635 8.661 8.636
26.295 27.386 19.524
31.76 27.361
35.536
我想把它转换成这样的
col1 col2 col3
'--' 8.661 8.636
17.635 '--' '--'
'--' '--' 19.524
26.295 '--' '--'
'--' 27.386 27.361
31.76 '--' '--'
'--' '--' 35.536
目标是组相似的值,相对于彼此为±0.2。如果没有匹配值,请添加占位符,例如' - '
首先将单个列转换为列表。
in_list = [
[17.635, 26.295, 31.76], #col 1
[8.661, 27.386], #col 2
[8.636, 19.524, 27.361, 35.536] #col 3
]
创建与之比较的参考列表。我的值是0.2。
ref_list = [x*0.2 for x in range(200)]
然后这是一个漫长的丑陋方式。
placeholder='--'
result = [[] for _ in range(len(input_list)+1)]
for ref in ref_list:
result[0].append(ref)
for i, lst in enumerate(input_list):
append_ref = True
for item in lst:
if item not in result[i+1]:
if ref + 0.2 > item < ref + 0.2:
result[i+1].append(item)
append_ref = False
break
if append_ref:
result[i+1].append(placeholder)
final_result = []
for i in range(len(result[0])):
l = [lst[i] for lst in result]
if all([x == placeholder for x in l[1:]]):
pass
else:
final_result.append(l)
print(final_result)
#Changed decimal for redability
[
#ref col1 col2 col3
[8.6, '--', 8.661, 8.636],
[17.6, 17.635, '--', '--'],
[19.40, '--', '--', 19.524],
[26.20, 26.295, '--', '--'],
[27.20, '--', 27.386, 27.361],
[31.6, 31.76, '--', '--'],
[35.4, '--', '--', 35.536]
]
还有更好的方法吗?
答案 0 :(得分:2)
根据我的想法,您可以通过首先过滤ref_list
中的项目然后针对每个ref
来缩短您的代码,您可以检查该列中是否存在具有所需差异的项目。
<强>代码:强>
in_list = [
[17.635, 26.295, 31.76], # col 1
[8.661, 27.386], # col 2
[8.636, 19.524, 27.361, 35.536] # col 3
]
def diff(item, ref):
return 0 <= item - ref < 0.2
refs = (
ref for ref in (x * 0.2 for x in range(200)) if any(
diff(item, ref) for row in in_list for item in row
)
)
for ref in refs:
lst = [format(ref, '.2f')]
for row in in_list:
item = next((item for item in row if diff(item, ref)), None)
if item is not None:
lst.append(item)
else:
lst.append('---')
print lst
<强>输出:强>
['8.60', '---', 8.661, 8.636]
['17.60', 17.635, '---', '---']
['19.40', '---', '---', 19.524]
['26.20', 26.295, '---', '---']
['27.20', '---', 27.386, 27.361]
['31.60', 31.76, '---', '---']
['35.40', '---', '---', 35.536]