在python中查找两个列表的共现

时间:2015-02-16 10:04:46

标签: python list

我有两个清单。第一个包含名称,第二个包含名称和相应的值。第二个列表名称的子集中第一个列表的名称。值是真或假。我想找到两个列表名称的共同出现并计算真值。我的代码:

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'], ....

3 个答案:

答案 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中基本上是intTrue == 1)。