我的代码出了什么问题?有更好的方法吗?

时间:2017-10-22 16:13:58

标签: python list adjacency-matrix

所以我得到了这个清单

integer_data=[[2, 3, 4, 5], [1, 2, 3, 6], [1, 3, 6], [0, 1, 5, 6], [1, 2, 3, 4]]

我得到了另一份清单

adjList=[[1, 0], [0, 2, 3, 1], [1, 3, 4, 5, 2], [1, 2, 4, 5, 3], [2, 3, 5, 6, 4], [2, 3, 4, 6, 5], [4, 5, 6]]

和一个空列表

listPrint=[]

我想在integer_data的每个列表中取第一个数字;例如。 no.2然后在adjList中找到最后一个数字与该数字匹配的列表(在本例中为no.2),这是list [1,3,4,5,2]。如果列表中的项目在integer_data中是不在[1,3,4,5,2]然后我追加“没有'列表打印,否则我追加'是'然后我转到integer_data中的下一个列表并重复。

adjList中每个列表的最后一个数字是唯一的。输出应为

resultList=['Yes','No','No','No','No','No']

我尝试使用此代码,结果相当遥远。我是Python的新手,所以任何帮助都会受到赞赏。

for item in integer_data:
itemToCheck=item[0]
 for itemTwo in adjList:
    itemTwoToCheck=itemTwo[-1]
    if itemToCheck==itemTwoToCheck:
        itemToCompareOne=item
        itemToCompareTwo=itemTwo
        for itemThree in itemToCompareOne:
            if itemThree not in itemToCompareTwo:
                listPrint.append('No')
            else:
                listPrint.append('Yes')

3 个答案:

答案 0 :(得分:0)

这是一个独立于编程语言的纯算法问题。

以下方法可以帮助您有效地实现目标:

  1. 复制integer_data中所有列表的第一个元素(按相同顺序)。比如first_elem_list
  2. 复制adjList中所有列表的最后一个元素(按相同顺序)。说last_elem_list
  3. 现在,检查last_elem_list中所有索引(位置)first_elem_list成员是否匹配(即相同的值)
  4. 如果匹配,则检查问题中告知的数字。如果没有,直接标记" no"在输出列表中。
  5. 希望这种方法进一步破解:)

答案 1 :(得分:0)

让我们通过你的例子。根据您的说明,我认为预期答案为['yes', 'no', 'no', 'no', 'no'],因为5中只有integer_data个列表。

另外,为简洁起见,我将这两个列表重命名为AB

A=[[2, 3, 4, 5], [1, 2, 3, 6], [1, 3, 6], [0, 1, 5, 6], [1, 2, 3, 4]]
B=[[1, 0], [0, 2, 3, 1], [1, 3, 4, 5, 2], [1, 2, 4, 5, 3], [2, 3, 5, 6, 4], [2, 3, 4, 6, 5], [4, 5, 6]]
listPrint=[]

# Construct dictionary d. 
# For every list in B, map its last element to the list itself
d={}
for list_b in B:
    d[list_b[-1]] = list_b

'''
In your example, d is
{   0: [1, 0],
    1: [0, 2, 3, 1],
    2: [1, 3, 4, 5, 2],
    3: [1, 2, 4, 5, 3],
    4: [2, 3, 5, 6, 4],
    5: [2, 3, 4, 6, 5],
    6: [4, 5, 6]
}
'''

for list_a in A:
    list_b = d[list_a[0]] # find the corresponding list_b
    answer = 'yes'
    for a in list_a:
        if a not in list_b:
            answer = 'no'
            break
    listPrint.append(answer)

print(listPrint) # ['yes', 'no', 'no', 'no', 'no']

答案 2 :(得分:0)

列表理解是循环遍历列表中项目并通过输入列表元素上的操作创建新列表的pythonic方法

alast = [e[-1] for e in adjList]

['Yes' if (d[0] in alast) and
          set(d).issubset(adjList[alast.index(d[0])])
       else 'No'
 for d in integer_data]

['Yes', 'No', 'No', 'No', 'No']  

第一个listcomp列出e[-1]

的每个子列表e中的最后一个数字adjList

第二个块实际上是一个列表推导(添加换行符),它从最后一行的d获取子列表integer_datafor d in integer_data

根据第1行和第2行之间的逻辑分割,前3行的内联if-else给出'Yes''No'

第一行逻辑(d[0] in alast)非常明显

逻辑上的第二行" and - ed"第一次检查d中的所有数字是否都在alast.index(d[0])的匹配索引adjList子列表中,使用python' s set内置对象' s .issubset()方法逻辑