我有两个清单。第一个包含名称,第二个包含名称和相应的值。第二个列表名称的子集中第一个列表的名称。值是真或假。我想找到两个列表名称的共同出现并计算真值。我的代码:
data1 = [line.strip() for line in open("text_files/first_list.txt", 'r')]
ins = open( "text_files/second_list.txt", "r" ) # the "r" is not really needed - default
parseTable = []
for line in ins:
row = line.rstrip().split(' ') # <- note use of rstrip()
parseTable.append(row)
new_data = []
indexes = []
for index in range(len(parseTable)):
new_data.append(parseTable[index][0])
indexes.append(parseTable[index][1])
in1 =return_indices_of_a(new_data, data1)
def return_indices_of_a(a, b):
b_set = set(b)
return [i for i, v in enumerate(a) if v in b_set] #return the co-occurrences
我正在读取包含列表的两个文本文件,我发现了共现,然后我想保留parseTable [] [1]只有in1索引。我做得对吗?我怎样才能保留我想要的指数?我的两个清单:
['SITNC', 'porkpackerpete', 'teensHijab', '1DAlert', 'IsmodoFashion',....
[['SITNC', 'true'], ['1DFAMlLY', 'false'], ['tibi', 'true'], ['1Dneews', 'false'], ....
答案 0 :(得分:2)
这是获得比赛的一个班轮:
matches = [(name, dict(values)[name]) for name in set(names) if name in dict(values)]
然后获得真实匹配的数量:
len([name for (name, value) in matches if value == 'true'])
修改强>
您可能希望将dict(values)
移动到命名变量中:
value_map = dict(values)
matches = [(name, value_map[name]) for name in set(names) if name in value_map]
答案 1 :(得分:1)
如果您只需要true
值的总和,请使用in
运算符和列表理解:
In [1]: names = ['SITNC', 'porkpackerpete', 'teensHijab', '1DAlert', 'IsmodoFashion']
In [2]: values = [['SITNC', 'true'], ['1DFAMlLY', 'false'], ['tibi', 'true'], ['1Dneews', 'false']]
In [3]: sum_of_true = len([v for v in values if v[0] in names and v[1] == "true"])
In [4]: sum_of_true
Out[4]: 1
为了得到共现的指数,这个单行可能会派上用场:
In [6]: true_indices = [names.index(v[0]) for v in values if v[0] in names and v[1] == "true"]
In [7]: true_indices
Out[7]: [0]
答案 2 :(得分:1)
有两种方法,一种是Andrey建议的(您可能希望将names
转换为set
),或者将第二个列表转换为字典:
mapping = dict(values)
sum_of_true = sum(mapping[n] for n in names)
后者sum
有效,因为bool
在Python中基本上是int
(True == 1
)。