У меня есть CSV-файл с несколькими строками и несколькими записями в каждой строке. Я знаю, как преобразовать каждую строку CSV в списки.

Например, ОТ

  1,x,2                       [1,x,2]
  3,x,4                       [3,x,4]
  5,y,6                       [5,y,6]
  7,y,8                       [7,y,8]

Но я не знаю, как я могу пройти через каждый список, не могу найти элементы, которые находятся в той же позиции, но в разных списках. Я хочу быть в состоянии обнаружить «х» и «у» (и любые другие элементы в той же позиции в последующих списках).

Кроме того, как только я могу обнаружить и различить x, y и т. Д., Я затем хочу сопоставить и проанализировать другой элемент соответствующих списков.

Например

[1, х, 2] [3, х, 4]

Сопоставьте 2 и 4, поскольку их списки имеют х.

[5, y, 6] [7, y, 8]

Сопоставьте 6 и 8, так как в их списках есть y.

0
Peshy 10 Ноя 2019 в 05:32

1 ответ

Простой способ создать коллекцию всех элементов, которые имеют определенное свойство, состоит в том, чтобы поместить их в словарь, который имеет ключ к этому свойству.

from collections import defaultdict
from typing import List, Dict, Tuple, Union

Entry = Union[int, str]
csv: List[List[Entry]] = [
    [1,'x',2],
    [3,'x',4],
    [5,'y',6],
    [7,'y',8]
]

index: Dict[Tuple[int, Entry], List[List[Entry]]] = defaultdict(list)

for row in csv:
    for i in range(len(row)):
        # Key on a tuple of i and the entry, e.g. (1, 'x') 
        index[(i, row[i])].append(row)

for key in index:
    if len(index[key]) > 1:
        print("index %d contains entry %s in multiple lists:" % key)
        print(index[key])

Производит следующий вывод:

index 1 contains entry x in multiple lists:
[[1, 'x', 2], [3, 'x', 4]]
index 1 contains entry y in multiple lists:
[[5, 'y', 6], [7, 'y', 8]]
0
Samwise 10 Ноя 2019 в 05:48
Спасибо за ваше решение. У меня небольшие проблемы с его адаптацией. Мои «x», «y» и т. Д. - это слова, а не числа. И я считаю, что ваше решение требует, чтобы они были целыми числами. У вас есть какой-нибудь совет, как я могу адаптировать это для текста / строки?
 – 
Peshy
10 Ноя 2019 в 07:32
Мое решение специально допускает, чтобы они были строками - 'x' и 'y' оба являются строковыми литералами, и я определил Entry как int или str (это что указывает тип Union).
 – 
Samwise
10 Ноя 2019 в 10:49
В коде также нет ничего, что требовало бы, чтобы Entry имел определенный тип; вы можете заменить его на Any, и все остальное будет работать точно так же.
 – 
Samwise
10 Ноя 2019 в 10:51