如何合并包含区间的两个列表
我有两个列表,列表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, )