如何在python中跨越2个二维数组?

2024-04-23 08:57:50 发布

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

我试图做一个程序,将采取两个代表网格文件,使他们重叠(纵横字谜)。你知道吗

让我更清楚地解释一下:

对于我网格中的每个单元格,我试图找到一个既在水平文件的行上又在垂直文件的列上的字符。你知道吗

“文件”水平.txt“:”

bac
def
hig

“文件”垂直.txt“:”

dhc
abf
gei

程序输出:

abc
def
ghi

对于单元格[0][0](左上角),水平文件第0行和垂直文件第0列上的字母都是“a”

所以基本上,行和列中的单词都是anagrams,我想找到一种方法来从前两个单词构造最终的表。你知道吗

我在python中尝试了这个方法来寻找常见的字母(我的网格是12x12):

#!/usr/bin/env python

import re

def printCrossword(c):
    for r in range(12):
        print ''.join(c[r])

with open('h.txt') as hFile:
    hFileData = hFile.readlines()

with open('v.txt') as vFile:
    vFileData = vFile.readlines()

hData = [[0 for x in xrange(12)] for x in xrange(12)]
vData = [[0 for x in xrange(12)] for x in xrange(12)]
fData = [[0 for x in xrange(12)] for x in xrange(12)]

for r in range(12):
    for c in range(12):
        hData[r][c] = hFileData[r][c]
        vData[c][r] = vFileData[r][c]


for r in range(12):
    for c in range(12):
        common = re.sub('[^' + ''.join(hData[r]) + ']', '', ''.join(vData[r]))
        if len(common) == 1:
            fData[r][c] = common
        else:
            fData[r][c] = ' '

printCrossword(hData)
print '------------'
printCrossword(vData)
print '------------'
printCrossword(fData)

以下是前4个单元格的流程图示:

Crosswords


Tags: 文件intxt网格fordef水平range
1条回答
网友
1楼 · 发布于 2024-04-23 08:57:50

I'm trying to find a char that's both on the row of the horizontal file and on the column of the vertical file.

除了in-and-output(我将不深入讨论)之外,您需要的是每个可能的行/列对中的字符集的简单交集算法。幸运的是Pythonhas sets built in(它们支持通过重载的&操作符进行交集):

# just row- and column-wise traversals of the grid
# I believe these correspond exactly to your hData and vData tables
rows = [ "bac", "def", "hig" ]
cols = [ "dag", "hbe", "cfi" ]

res = [ [ set(r) & set(c) for c in cols ] for r in rows ]
print(res)

这将计算可能出现在输出中相应位置的字符集(通常,可能有多个候选字符):

[[set(['a']), set(['b']), set(['c'])], 
 [set(['d']), set(['e']), set(['f'])], 
 [set(['g']), set(['h']), set(['i'])]]

如果预先知道不存在歧义(例如,如果所有字符都是不同的)并且网格是可解的,则可以使用^{}函数:

res = [ [ next(iter(set(r) & set(c))) for c in cols ] for r in rows ]

输出:

[['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]

相关问题 更多 >