Как сделать это - пересечение словаря Python и поиск

Вот компактный способ сделать это:

static void Main(string[] args)
{
  // Read all lines from file
  var lines = File.ReadAllLines("Path");
  string[] linesToWrite = new string[lines.Length];
  for (int i = 0; i < lines.Length; i++)
  {
    var cells = lines[i].Split('|');
    // Appned value in "TotalAcc" column at the end of current line
    // and store it in array of lines, that will be written to file
    linesToWrite[i] = lines[i] + cells[2];
  }
  File.WriteAllLines("path", linesToWrite);
}
10
задан dreftymac 12 July 2018 в 20:46
поделиться

4 ответа

Ваша структура неприятно неправильна. Вот версия с функцией Посетителя, которая пересекает attrs подсловари.

def walkDict( aDict, visitor, path=() ):
    for  k in aDict:
        if k == 'attrs':
            visitor( path, aDict[k] )
        elif type(aDict[k]) != dict:
            pass
        else:
            walkDict( aDict[k], visitor, path+(k,) )

def printMe( path, element ):
    print path, element

def filterFor( path, element ):
    if element['id'] == '4130-2-2':
        print path, element

Вы использовали бы его как это.

walkDict( myDict, filterFor )

Это может быть превращено в генератор вместо Посетителя; это было бы yield path, aDict[k] вместо того, чтобы вызвать функцию посетителя.

Вы использовали бы его в для цикла.

for path, attrDict in walkDictIter( aDict ):
    # process attrDict...
15
ответ дан 3 December 2019 в 13:41
поделиться

Если Вы хотите решить проблему общим способом, неважно, сколько уровня вложения Вы имеете в своем dict, то создаете рекурсивную функцию, которая пересечет дерево:

def traverse_tree(dictionary, id=None):
    for key, value in dictionary.items():
        if key == 'id':
            if value == id:
                print dictionary
        else:
             traverse_tree(value, id)
    return

>>> traverse_tree({1: {'id': 2}, 2: {'id': 3}}, id=2)
{'id': 2}
13
ответ дан 3 December 2019 в 13:41
поделиться

Этот вид проблемы часто лучше решается с надлежащими определениями классов, не универсальными словарями.

class ProperObject( object ):
    """A proper class definition for each "attr" dictionary."""
    def __init__( self, path, attrDict ):
        self.path= path
        self.__dict__.update( attrDict )
    def __str__( self ):
        return "path %r, entity %r, hash %r, id %r" % (
            self.path, self.entity, self.hash, self.id )

masterDict= {} 
def builder( path, element ):
    masterDict[path]= ProperObject( path, element )

# Use the Visitor to build ProperObjects for each "attr"
walkDict( myDict, builder )

# Now that we have a simple dictionary of Proper Objects, things are simple
for k,v in masterDict.items():
    if v.id == '4130-2-2':
        print v

Кроме того, теперь, когда у Вас есть Надлежащие Определения объектов, можно сделать следующее

# Create an "index" of your ProperObjects
import collections
byId= collections.defaultdict(list)
for k in masterDict:
    byId[masterDict[k].id].append( masterDict[k] )

# Look up a particular item in the index
print map( str, byId['4130-2-2'] )
9
ответ дан 3 December 2019 в 13:41
поделиться

Ну, если необходимо сделать это только несколько раз, можно просто использовать вложенный dict.iteritems () для нахождения то, что Вы ищете.

Если Вы запланируете сделать это несколько раз, то действия будут быстро становиться проблемой. В этом случае Вы могли:

  • измените путь Вы, данные возвращаются Вам к чему-то более подходящему.

  • если Вы не можете, преобразовать данные однажды муха к dict между идентификатором и ключами (использующий iteritems). Затем используйте его.

0
ответ дан 3 December 2019 в 13:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: