使用嵌套for循环在Python中列出匹配

时间:2016-01-20 21:58:03

标签: python

我有三个清单,(1)治疗(2)药物名称和(3)药物代码符号。我正在尝试为14,700种治疗中的每一种确定相应的药物代码符号。我目前的方法是确定(2)中的任何名称是否在“in”(1)中,然后返回相应的(3)。但是,我返回了对应于14,700种治疗的药物代码符号的列表(正确长度)。我写的方法代码如下:

codes = pandas.read_csv('Codes.csv', dtype=str)
codes_list = _codes.values.tolist()

names = pandas.read_csv('Names.csv', dtype=str)
names_list = names.values.tolist()

treatments = pandas.read_csv('Treatments.csv', dtype=str)
treatments_list = treatments.values.tolist()   

matched_codes_list = range(len(treatments_list))
for i in range(len(treatments_list)):
    for j in range(len(names_list)):
        if names_list[j] in treatments_list[i]:
            matched_codes_list[i]=codes_list_text[j]
print matched_codes_list

对于我出错的地方的任何建议都将不胜感激!

1 个答案:

答案 0 :(得分:0)

我不知道你在期待什么。您应该用示例替换xxx_list代码,因为您似乎没有任何csv读取问题。

我们假设您这样做了,结果看起来像这样。

codes_list = ['shark', 'panda', 'horse']
names_list = ['fin', 'paw', 'hoof']
assert len(codes_list) == len(names_list)
treatments_list = ['tape up fin', 'reverse paw', 'stand on one hoof', 'pawn affinity maneuver', 'alert wing patrol']

听起来你正试图确定每个'治疗'的'代码',假设代码和名称的数量是相同的(并指出一些映射)。您计划使用名称的存在来确定代码。

我们可以将名称和代码列表压缩在一起以避免在那里使用索引,并且我们可以在处理列表上使用迭代而不是pythonic可读性的索引

matched_codes_list = []
for treatment in treatment:
    matched_codes = []
    for name, code in zip(names_list, codes_list):
        if name in treatment:
            matched_codes.append(code)
    matched_codes_list.append(matched_codes)

这会产生类似

的东西
assert matched_codes_list == [
  ['shark'],                    # 'tape up fin'
  ['panda'],                    # 'reverse paw'
  ['horse'],                    # 'stand on one hoof'
  ['shark', 'panda', 'horse'],  # 'pawn affinity maneuver'
  [],                           # 'alert wing patrol'
]

请注意,用于执行此操作的方法非常慢(并且可能会出现误报,请参阅第4项)。您将遍历每个名​​称/代码对的所有处理描述的文本。

你可以使用像'lookup = {name:code for name,code in zip(names_list,codes_list)}或itertools.izip这样的词典来获得微小的收益。否则可能需要更聪明的东西,可能将处理分成包含单词的集合,或将单词映射成多个代码。