还是一个Python新手,所以请放轻松我...
我已经设置了字典:
new_dict
我想过滤以返回键,其中每个键附加的任何值与我设置的现有列表中的值匹配:
list(data.Mapped_gene)
有什么想法吗?
编辑: 我仍然无法完成这项工作。
如果有帮助,csv表和键都是字符串。
以下是扩大理解的完整代码:
import csv
new_dict = {}
with open(raw_input("Enter csv file (including path)"), 'rb') as f:
reader = csv.reader(f)
for row in reader:
if row[0] in new_dict:
new_dict[row[0]].append(row[1:])
else:
new_dict[row[0]] = row[1:]
print new_dict
#modified from: http://bit.ly/1iOS7Gu
import pandas
colnames = ['Date Added to Catalog', 'PUBMEDID', 'First Author', 'Date', 'Journal', 'Link', 'Study', 'DT', 'Initial Sample Size', 'Replication Sample Size', 'Region', 'Chr_id', 'Chr_pos', 'Reported Gene(s)', 'Mapped_gene', 'p-Value', 'Pvalue_mlog', 'p-Value (text)', 'OR or beta', '95% CI (text)', 'Platform [SNPs passing QC]', 'CNV']
data = pandas.read_csv('C:\Users\Chris\Desktop\gwascatalog.csv', names=colnames)
my_list = list(data.Mapped_gene)
my_set = set(my_list)
[k for k, v in new_dict.items() if any(x in my_set for x in v)]
错误讯息: “TypeError:unhashable type:'list'”
答案 0 :(得分:3)
使用any
和列表理解:
my_list = list(data.Mapped_gene)
keys = [k for k, v in new_dict.items() if any(x in my_list for x in v)]
如果my_list
很大,请先将其转换为set
,因为它会提供O(1)
次查找。
答案 1 :(得分:2)
geneset = set(data.Mapped_gene)
[k for k, v in new_dict.items() if geneset.intersection(v)]
答案 2 :(得分:0)
要提高查找性能,请将列表转换为集合。
gene_set = set(data.Mapped_gene)
然后使用其他示例中显示的列表理解或字典理解 如果你对这个价值感兴趣的话。
{k:v for k, v in my_dict.iteritems() if v in gene_set}
如果iteritems()
很大,my_dict
上的方法my_dict
方法特别有用。为了使您的方法更有效,您可以使用生成器而不是列表或字典理解:
(k for k, v in my_dict.iteritems() if v in gene_set)