【问题标题】:How to split the data in a group of N lines and find intersection character如何拆分一组 N 行中的数据并找到交集字符
【发布时间】:2022-12-04 01:31:24
【问题描述】:

我有如下数据集:

data="""vJrwpWtwJgWrhcsFMMfFFhFp
jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL
PmmdzqPrVvPwwTWBwg
wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn
ttgJtRGJQctTZtZT
CrZsJsPPZsGzwwsLwLmpwMDw"""

这些是单独的行。现在,我想将数据分组为 set of 3 rows 并在这些行中找到相交字符。例如,r是第一组中的常用字符,Z是第二组中的典型字符。所以,下面是我的代码:

lines = []
for i in range(len(data.splitlines())):
    lines.append(data[i])
    for j in lines:
        new_line = [k for k in j[i] if k in j[i + 1]]
        print(new_line)  

它给了我一个字符串索引超出范围的错误。

new_line = [k for k in j[i] if k in j[i + 1]]
IndexError: string index out of range

【问题讨论】:

  • 这是 AoC day3 谜题吗?

标签: python python-3.x


【解决方案1】:

郑重声明:这是 Advent of Code 2022 第 3 天第 2 部分的挑战。我将我的数据保存在一个名为 input.txt 的文件中,然后逐行读取,但这个解决方案也可以应用于字符串。

我将每行转换为 set 并使用了 & 交集运算符。从那里,我将它转换为一个列表并删除了换行符。 s[0] 因此是唯一重复的字符。像这样:

with open('input.txt') as f:
    lines = f.readlines()
    for i in range(0, len(lines), 3):
        s = list(set(lines[i]) & set(lines[i + 1]) & set(lines[i + 2]))
        s.remove('
')
        print(s[0])

这是一个使用您的 data 字符串的示例。在这种情况下,我将按换行符拆分,不再需要将其从列表中删除。我还会从集合中提取元素而不转换为列表:

data = """vJrwpWtwJgWrhcsFMMfFFhFp
jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL
PmmdzqPrVvPwwTWBwg
wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn
ttgJtRGJQctTZtZT
CrZsJsPPZsGzwwsLwLmpwMDw"""


lines = data.split('
')
for i in range(0, len(lines), 3):
    (ch,) = list(set(lines[i]) & set(lines[i + 1]) & set(lines[i + 2]))
    print(ch)

【讨论】:

  • 这里很聪明。
【解决方案2】:

如果我正确理解你的问题:

今天早上刚巧解决了它。 ;-)

# ordering = ascii_lowercase + ascii_uppercase

# with open('day03.in') as fin:
#    data = fin.read().strip()
    
# b = 0
lines = data.split('
') # assuming some date- read-in already

# go through 3 chunks:
for i in range(0, len(lines), 3):
    chunk = lines[i: i+3]
    print(chunk)
    
    for i, c in enumerate(ordering):
        if all(c in ll  for ll in chunk):
            # do some more ops.

# ...............

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多