从字典值中删除重复项

2024-09-28 04:19:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做的程序是从文本文件验证数独。到目前为止我有这个。你知道吗

file=input("Enter a filename: ")
with open(file) as data:
    rowt=[0 for i in range(9)]
    colt=[0 for i in range(9)]
    for a,b in enumerate(data):
        sb_rowt = 0
        print (a,b)
        for c, d in enumerate(b.split()):
            print (c,d)
            sb_rowt+=int(d)
            colt[c]+=int(d)
        rowt[a]=sb_rowt
    rows=all(i==45 for i in rowt)
    cols=all(i==45 for i in colt)
    print(rows and cols)

问题是如果我有这样一个文本文件

5 5 5 5 5 5 5 5 5 
5 5 5 5 5 5 5 5 5
5 5 5 5 5 5 5 5 5 
5 5 5 5 5 5 5 5 5 
5 5 5 5 5 5 5 5 5 
5 5 5 5 5 5 5 5 5 
5 5 5 5 5 5 5 5 5 
5 5 5 5 5 5 5 5 5 
5 5 5 5 5 5 5 5 5 
5 5 5 5 5 5 5 5 5 

程序仍将输出为true。我知道我需要删除任何重复的条目,但我不确定如何。你知道吗


Tags: in程序fordatarangeallfilerows
3条回答

应将读取和验证操作分开:

# read first
file = input("Enter a filename: ")
with open(file) as data:
    array = [ [ int(i) for i in line.split() ] for line in data ]

只有这样才能验证。你知道吗

# first create a set of numbers 1...9
all_numbers = set(range(1, 10))

# validate rows and columns:
valid = True

# we validate ith row and column in the same loop
for i in range(9):
    row_i    = array[i]
    column_i = [ array[rownum][i] for rownum in range(9) ]
    valid   &= set(row_i) == all_numbers
    valid   &= set(column_i) == all_numbers

# valid is True if all constraints succeeded.

# TODO: in sudoku you also need to validate the 
# 3x3 subsquares.

从你的问题来看,我认为你没有走上正轨。无论有效与否,电路板上都应该有9*9的数字。您得到了正确的输入,但未能验证它。考虑改进验证算法。你知道吗

您不能仅使用数字的总和来验证网格。相反,您必须检查每一行和每一列是否包含从1到9的所有数字。你知道吗

你可以这样做:

all_nums = set(range(1, 10))
with open("data") as data:
    field = [[int(x) for x in line.split()] for line in data]
    rows = map(set, field)
    cols = map(set, zip(*field))
    rows_ok = all(row == all_nums) for row in rows)
    cols_ok = all(col == all_nums) for col in cols)

首先,我从数据输入创建一个整数列表。然后我提取行和列(zip(*field)基本上在侧面翻转field),并将它们转换成set,因为顺序并不重要。最后,我将all行和列与all_nums集进行比较。你知道吗

相关问题 更多 >

    热门问题