我尝试使用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()
有人可以帮忙吗?谢谢
答案 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.txt
和lbound
包含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