如何合并包含区间的两个列表

2 投票
7 回答
677 浏览
提问于 2025-04-16 16:50

我有两个列表,列表1和列表2,我想得到一个新的列表3。如果有人能推荐一个用Python或awk写的脚本,那就太好了。

List 1
A   100-160
B   200-500
C   800-1500
D   1600-2000
E   2500-3000

List 2
150
600
900
1700
2400


List 3
A   100-160        150
B   200-500 
C   800-1500    900
D   1600-2000   1700
E   2500-3000   

7 个回答

1

在命令行上简单地操作。目前这是所有解决方案中唯一一个使用awk的办法:

 paste list1 list2|awk '{split($2,a,"-");
                           if($3>a[1] && $3<a[2])
                           {h=$3}
                           else
                           {h=""};
                           print $1,$2,h}'

A 100-160 150
B 200-500
C 800-1500 900
D 1600-2000 1700
E 2500-3000
2

你可以从列表1创建一个字典,这个字典包含了一些区间,然后再遍历这个字典,看看列表2中的任何一个值是否在这些区间内。举个例子,

list1 = {"A": [100, 160], "B": [200, 500], "C": [800, 1500],
         "D": [1600, 2000], "E": [2500,3000]}

list2 = [150, 600, 900, 1700, 2400]

for key, val in list1.iteritems():
    for num in list2:
        if num in range(val[0], val[1]):
            val.append(num)

for key, val in sorted(list1.iteritems()):
    print key, ":", val
2

这里有一个例子。它需要在命令行中传入两个文件名。

import sys

if len(sys.argv) != 3:
    print 'parameters: list1 list2'
    sys.exit(1)

list1 = []
for line in file(sys.argv[1]):
    fields = line.split()
    f1 = fields[0]
    f2, f3 = fields[1].split('-')
    list1.append((f1, int(f2), int(f3), [], ))

for line in file(sys.argv[2]):
    value = int(line)
    for name, lb, ub, values in list1:
        if value >= lb and value <= ub:
            values.append(str(value))

for name, lb, ub, values in list1:
    if values: vals = ','.join(values)
    else: vals = ''
    print '%s %d-%d %s' % (name, lb, ub, vals, )

撰写回答