дать массив a-z, пока возможно ZZZ ... ключ с php или python - PullRequest
0 голосов
/ 02 августа 2011

Допустим, у меня есть неизвестная строка в массиве, она будет выглядеть как

$arr = array(
'string 1',
'string 2',
'string 3',
'string 4',
'string 5',
// up to a certain unknown amount

1. Как мы можем дать им значение, как показано ниже?

'string 1' => a, 
'string 2' => b,
'string 26' => z, 
'string 27' => A,
'string 52' => Z,
'string 53' => aa,
// up to a certain unknown amount possibly until ZZZZ, or maybe more.

обновление вот что я сделал до сих пор

function num2a($a){

    # A-Z
    for ($i=65; $i < 91 ; $i++) { 
        #echo chr($i);
        $arr[] = chr($i);
    }

    # a-z
    for ($i=97; $i < 123 ; $i++) { 
        #echo chr($i);
        $arr[] = chr($i);
    }

    // a-Z
    if ( 0 <= $a && $a <= 51 ) {
        echo $arr[$a];
    }

    // aa-ZZ not done
    if ( 52 <= $a && $a <= 53 ) {

        for ($x=0; $x < 1; $x++) {
            # A = 0  
            # a = 26
            # somehow if i put $a = 52 it will do a aa
            $a = $a - 26;
            $arr[$a] = $arr[$a] . $arr[$a];
            echo $arr[$a];
        }
    }
}

Ответы [ 5 ]

2 голосов
/ 02 августа 2011

В Python относительно легко иметь бесконечный массив с использованием генераторов, а также произвольно длинных, лениво вычисляемых и т. Д. Что бы вы хотели сделать, чтобы сопоставить подобные вещи с ключами, это иметь бесконечно длинный , лениво оцененный список или генератор .

import itertools
import string

Сначала вы хотите itertools, который имеет множество удобных функций для манипулирования массивами бесконечного размера. строка содержит несколько стандартных строковых констант.

def lower_then_upper():
    return iter(string.letters)

iter здесь строго не требуется, но для согласованности он превратит стандартный список в генератор.

def get_n(n=2):
    generators = []
    for gen in range(n):
        generators.append(lower_then_upper())
    tuples = itertools.product(*generators)
    return itertools.imap(''.join, tuples)

Здесь мы начинаем собирать вещи, эта функция будет возвращать список строк фиксированной длины, составленный из букв. Строка за строкой, биты перед tuples обеспечивают наличие генератора для всех строк, доступных для каждой буквенной позиции. т.е. три списка a-Z будут созданы, если n = 3.

Ниже itertools.product делает декартово произведение всех доступных вещей, которое в Python, к счастью, повторяет последнее первым, так что вы получите для n = 2: `['aa', 'ab', ..., 'ZX', 'ZY', 'ZZ'].

В последней строке itertools.imap применяется функция ''.join к каждому элементу в кортежах. До сих пор они имели форму (('a', 'a'), ('a', 'b'), …, это гарантирует, что они являются строкой, так же, как ''.join(['a', 'a']) == 'aa'.

def get_infinite():
    n = 0
    while True:
        n += 1
        for item in get_n(n):
            yield item

Здесь происходит волшебство. Он исчерпает итератор для n = 1, а затем исчерпает n = 2 и т. Д.

def inf_hello():
    while True:
        yield "hello world"

Это просто демонстрационный бесконечный список

mapped = itertools.izip(get_infinite(), inf_hello())

Теперь мы объединяем их вместе, чтобы получить бесконечный массив пар ключ / значение:

>>> list(itertools.islice(mapped, 1000, 1010))
[('sm', 'hello world'), ('sn', 'hello world'), ('so', 'hello world'), ('sp', 'hello world'), ('sq', 'hello world'), ('sr', 'hello world'), ('ss', 'hello world'), ('st', 'hello world'), ('su', 'hello world'), ('sv', 'hello world')]

как мы видим, если мы интроспектируем это 1000 элементов в.

В качестве альтернативы, мы можем дать ему длинный список и получить словарь:

>>> numbers = dict(itertools.izip(get_infinite(), range(0, 10000)))
>>> print numbers['a'], numbers['aa'], numbers['caW']
0 52 8212

Надеюсь, это поможет.

1 голос
/ 02 августа 2011

Предупреждение, в псевдо-коде. Это идея, сначала создайте карту примерно так:

map['1'->'26'] = 'a'->'z'
map['27'->'52'] = 'A'->'Z'

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

int numFromData = getNumber('string 53')
while( numFromData > 0){
   int mapKey = numFromData % 52; //since we have 52 mapped values
   print( map[ mapKey] ); 
   numFromData /= 52; 
}

Я думаю, что это должно работать, никаких гарантий, но идея верна.

0 голосов
/ 02 августа 2011
$str = ""; // Your String
$results = array();
$input = explode(",", $str);
foreach($input as $v) {
    $value = explode("=>", $v);
    if(!isset($results[$value[0]])) {
        $results[$value[0]] = $value[1];
    }
}
0 голосов
/ 02 августа 2011

1) Если вам действительно не нужен верхний регистр

for($i="a";$i!="bc";++$i)
    print $i."\n";
0 голосов
/ 02 августа 2011

Ну, вы можете легко дать ему цифровые клавиши:

$strArray = explode(",",$string);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...