根据另一列中的值查找两个其他列的值范围

时间:2016-12-14 20:26:07

标签: python

我尝试使用python根据TableB第一列的值在两列(TableA)中查找值范围。 TableA中的第1列和第2列表示值的范围每当表B中第1列的值落在一个范围内时,我想从TableA中提取这些行,如输出中所示,并且也知道它们的数量。

表A:

1   524
677 822
902 1103
1239    1790
2001    2321
3900    4567

表B:

351 aux
1256    sle
4002    aim

必需的输出:

1   524
1239    1790
3900    4567

Total count = 3 

我的尝试不起作用:

datA = open('TableA.txt','r')
datB = open('TableB.txt','r')

count=0
for line1 in datB:
    line1 = line1.strip().split()
    for line2 in datA:
    line2 = line2.strip().split('\t')
        for col1, col2 in zip(line2[0], line2[1]):
            if line2 > col1 and line2 < col2:
                print(col1 + '\t' + col2) 
                count=+1
print(count)
datA.close()

datB.close()

有人可以帮忙吗?谢谢

3 个答案:

答案 0 :(得分:1)

你可以这样试试:

selenium

tableBcol1=[int(i.split()[0]) for i in open('TableB.txt')] tableA=[i.strip() for i in open('TableA.txt')] count=0 for bcol1 in tableBcol1: for line in tableA: lbound,hbound=line.split() if bcol1 in range(int(lbound),int(hbound)+1): print(line.strip()) count+=1 print(count) 以整数形式包含tableBcol1中column1的所有值(即351,1256,4002)。

TableB.txtlbound包含hbound中column1和column2的值。

最后,您检查TableA.txt语句中的成员身份。如果if的第1列的值在范围内,则从TableB.txt打印该行。注意,一个被添加到范围中的TableA.txt,因为上限是非包含的。

答案 1 :(得分:1)

TableA = """1   524
            677 822
            902 1103
            1239    1790
            2001    2321
            3900    4567"""

TableB = """351 aux
            1256    sle
            4002    aim"""

#TableA = open('TableA.txt', 'r').read()
#TableB = open('TableB.txt', 'r').read()

ranksA = [map(int, e.split()) for e in TableA.split("\n")]
valuesB = [int(e.split()[0]) for e in TableB.split("\n")]

resultsraw = [(v, [(ri, rf) for ri, rf in ranksA if v >= ri and v <= rf]) for v in valuesB]
results = "\n".join(["%6s\t%6s" % e[1][0] for e in resultsraw])

print results
print "Total count: %s" % (len(resultsraw))

输出:

     1     524
  1239    1790
  3900    4567
Total count: 3

答案 2 :(得分:1)

报告并总计表B中每个项目的范围,该范围属于表A中的范围。

以下是使用defaultdict作为计数器的另一种方法,csv用于读取表格数据,with语句用于安全打开/关闭文件:

import csv
from collections import defaultdict

# Build reference dict
with open("Table A.txt", "r") as f:
    reader = csv.reader(f)
#     reference = defaultdict(list)
    reference = defaultdict(int)
    for row in reader:
        reference[row[0]]

# Read data and tally
with open("Table B.txt", "r") as f:
    reader2 = csv.reader(f)
#     header = next(reader2)
    for row in reader2:
        col1 = int(row[0].split()[0])
        for key in reference:
            first, last = map(int, key.split())
            if col1 >= first and col1 <= last:
#                 reference[key].append(row)
                reference[key] += 1

reference

结果是一个字典,用于计算适合给定范围的条目。

defaultdict(int,
            {'1   524': 1,
             '1239    1790': 1,
             '2001    2321': 0,
             '3900    4567': 1,
             '677 822': 0,
             '902 1103': 0})

defaultdict为您提供存储整数或将值附加到列表的选项(请参阅注释行)。但是,对于您想要的输出:

for k, v  in reference.items():
    if v:
        print(k)
print("Total:", total)

最终输出:

1   524
1239    1790
3900    4567
Total: 3