将多个列表中的相似值分组

时间:2018-03-05 04:53:10

标签: python list

我有这样的价值观。

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

还有更好的方法吗?

1 个答案:

答案 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]