o
    ‹¨ÊhW(  ã                   @   s:   d Z ddlZddlmZ ddlmZ G dd„ dejƒZ	dS )z¿
    pyexcel.internal.sheets.column
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Generic table column

    :copyright: (c) 2015-2017 by Onni Software Ltd.
    :license: New BSD License
é    Né   )Ú_sharedc                   @   sb   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zddd„Zdd„ ZdS )ÚColumnap  Represent columns of a matrix

    .. table:: "example.csv"

        = = =
        1 2 3
        4 5 6
        7 8 9
        = = =

    Let us manipulate the data columns on the above data matrix::

        >>> import pyexcel as pe
        >>> data = [[1,2,3], [4,5,6], [7,8,9]]
        >>> m = pe.internal.sheets.Matrix(data)
        >>> m.column[0]
        [1, 4, 7]
        >>> m.column[2] = [0, 0, 0]
        >>> m.column[2]
        [0, 0, 0]
        >>> del m.column[1]
        >>> m.column[1]
        [0, 0, 0]
        >>> m.column[2]
        Traceback (most recent call last):
            ...
        IndexError

    c                 C   s^   g }t  |t¡rt || jj¡}n|}g }| j ¡ D ]}||vr%| |¡ q| jj	|d� dS )a]  
        Examples:

            >>> import pyexcel as pe
            >>> data = [[1,2,3,4,5,6,7,9]]
            >>> sheet = pe.Sheet(data)
            >>> sheet
            pyexcel sheet:
            +---+---+---+---+---+---+---+---+
            | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 |
            +---+---+---+---+---+---+---+---+
            >>> sheet.column.select([1,2,3,5])
            >>> sheet
            pyexcel sheet:
            +---+---+---+---+
            | 2 | 3 | 4 | 6 |
            +---+---+---+---+
            >>> data = [[1,2,3,4,5,6,7,9]]
            >>> sheet = pe.Sheet(data)
            >>> sheet
            pyexcel sheet:
            +---+---+---+---+---+---+---+---+
            | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 |
            +---+---+---+---+---+---+---+---+
            >>> sheet.column.select([1,2,3,5])
            >>> sheet
            pyexcel sheet:
            +---+---+---+---+
            | 2 | 3 | 4 | 6 |
            +---+---+---+---+
            >>> data = [
            ...     ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'],
            ...     [1,2,3,4,5,6,7,9],
            ... ]
            >>> sheet = pe.Sheet(data, name_columns_by_row=0)
            >>> sheet
            pyexcel sheet:
            +---+---+---+---+---+---+---+---+
            | a | b | c | d | e | f | g | h |
            +===+===+===+===+===+===+===+===+
            | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 |
            +---+---+---+---+---+---+---+---+
            >>> del sheet.column['a', 'b', 'i', 'f'] # doctest:+ELLIPSIS
            Traceback (most recent call last):
                ...
            ValueError: ...
            >>> sheet.column.select(['a', 'c', 'e', 'h'])
            >>> sheet
            pyexcel sheet:
            +---+---+---+---+
            | a | c | e | h |
            +===+===+===+===+
            | 1 | 3 | 5 | 9 |
            +---+---+---+---+
        ©Úcolumn_indicesN)
ÚcompactÚis_array_typeÚstrÚutilsÚnames_to_indicesÚ_refÚcolnamesÚcolumn_rangeÚappendÚfilter)ÚselfÚindicesÚnew_indicesÚ	to_removeÚindex© r   úP/var/www/html/env/lib/python3.10/site-packages/pyexcel/internal/sheets/column.pyÚselect/   s   8
€zColumn.selectc                 C   sF  t  t|ƒ¡ot| jdƒ}|r| j |¡ dS t  |¡r.t t	|ƒ| jj
¡}| j |¡ dS t|tƒrDt || j ¡ ¡}| j |¡ dS t|tƒrWt |¡}| j |g¡ dS t|tƒrit	|ƒ}| jj|d� dS t|t	ƒry|}| jj|d� dS t|tƒr‡| j |g¡ dS t|tjƒr”|  |¡ dS t|tjƒr¡|  |¡ dS t‚)a³  Override the operator to delete items

        Examples:

            >>> import pyexcel as pe
            >>> data = [[1,2,3,4,5,6,7,9]]
            >>> sheet = pe.Sheet(data)
            >>> sheet
            pyexcel sheet:
            +---+---+---+---+---+---+---+---+
            | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 |
            +---+---+---+---+---+---+---+---+
            >>> del sheet.column[1,2,3,5]
            >>> sheet
            pyexcel sheet:
            +---+---+---+---+
            | 1 | 5 | 7 | 9 |
            +---+---+---+---+
            >>> data = [
            ...     ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'],
            ...     [1,2,3,4,5,6,7,9],
            ... ]
            >>> sheet = pe.Sheet(data, name_columns_by_row=0)
            >>> sheet
            pyexcel sheet:
            +---+---+---+---+---+---+---+---+
            | a | b | c | d | e | f | g | h |
            +===+===+===+===+===+===+===+===+
            | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 |
            +---+---+---+---+---+---+---+---+
            >>> del sheet.column['a', 'b', 'i', 'f'] # doctest:+ELLIPSIS
            Traceback (most recent call last):
                ...
            ValueError: ...
            >>> del sheet.column['a', 'c', 'e', 'h']
            >>> sheet
            pyexcel sheet:
            +---+---+---+---+
            | b | d | f | g |
            +===+===+===+===+
            | 2 | 4 | 6 | 7 |
            +---+---+---+---+

        Údelete_named_column_atr   N)r   Ú	is_stringÚtypeÚhasattrr   r   Úis_tuple_consists_of_stringsr
   r   Úlistr   Údelete_columnsÚ
isinstanceÚsliceÚanalyse_sliceÚnumber_of_columnsr	   Úexcel_column_indexÚtupler   ÚintÚtypesÚ
LambdaTypeÚ_delete_columns_by_contentÚFunctionTypeÚ
IndexError)r   ÚasliceÚis_sheetr   Úmy_ranger   r   r   r   Ú__delitem__r   s:   -ÿ


ÿ




zColumn.__delitem__c                 C   sP   g }t | j ¡ ƒD ]\}}|||ƒr| |¡ q	t|ƒdkr&| j |¡ d S d S ©Nr   )Ú	enumerater   Úcolumnsr   Úlenr   )r   Úlocatorr   r   Úcolumnr   r   r   r)   ¾   s   

€ÿz!Column._delete_columns_by_contentc                 C   s®   t  t|ƒ¡ot| jdƒ}|r| j ||¡ dS t|tƒr4t 	|| j 
¡ ¡}|D ]	}| j ||¡ q(dS t|tƒrGt |¡}| j ||¡ dS t|tƒrU| j ||¡ dS t‚)z"Override the operator to set itemsÚset_named_column_atN)r   r   r   r   r   r6   r    r!   r
   r"   r#   Úset_column_atr	   r$   r&   r+   )r   r,   Úa_columnr-   r.   Úir   r   r   r   Ú__setitem__Æ   s$   ÿ

ÿÿ


zColumn.__setitem__c                 C   s¦   |}t  t|ƒ¡ot| jdƒ}|r| j |¡S t|tƒr7t 	|| j 
¡ ¡}g }|D ]}| | j |¡¡ q)|S t|tƒrAt |¡}t |¡| j ¡ v rQ| j |¡S t‚)zNBy default, this class recognize from top to bottom
        from left to rightÚnamed_column_at)r   r   r   r   r   r;   r    r!   r
   r"   r#   r   Ú	column_atr	   r$   Úabsr   r+   )r   r,   r   r-   r.   Úresultsr9   r   r   r   Ú__getitem__Û   s&   ÿ

ÿ

zColumn.__getitem__c                 C   sX   t |tjƒr| j |¡ | S t |tƒr| j |¡ | S t|dƒr*| j | ¡ ¡ | S t	‚)ú0Overload += sign

        :return: self
        Úget_internal_array)
r    r   ÚOrderedDictr   Úextend_columnsr   r   Úextend_columns_with_rowsrA   Ú	TypeError©r   Úotherr   r   r   Ú__iadd__ö   s   
ù
ûþzColumn.__iadd__c                 C   s   |   |¡ | jS )r@   )rH   r   rF   r   r   r   Ú__add__  s   
zColumn.__add__c                 C   s@   |}|| j jvr| dd¡}|| j jvrtd| ƒ‚| j  |¡S )z,
        Refer to sheet.column.name
        Ú_ú z%s is not found)r   r   ÚreplaceÚAttributeErrorr;   )r   ÚattrÚthe_attrr   r   r   Ú__getattr__  s   zColumn.__getattr__Nc                 C   sB   |dur|   ||¡ dS |r|D ]}|   |d |d ¡ qdS dS )zFormat a column
        Nr   r   )Ú_handle_one_formatter)r   Úcolumn_indexÚ	formatterÚformat_specsÚspecr   r   r   Úformat  s   þzColumn.formatc                 C   sÆ   |}t | jjƒdkrt || jj¡}tj |¡}t|tƒrF| j 	¡ D ]!}||v rC| j 
¡ D ]}| j ||¡}||ƒ}| j |||¡ q-q"d S | j 
¡ D ]}| j ||¡}||ƒ}| j |||¡ qKd S r0   )r3   r   r   r
   r   ÚCommonPropertyAmongRowNColumnÚget_converterr    r   r   Ú	row_rangeÚ
cell_value)r   r2   Útheformatterr   Ú	converterÚrcolumnÚrowÚvaluer   r   r   rQ   #  s(   ÿ
€ûýzColumn._handle_one_formatter)NNN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r/   r)   r:   r?   rH   rI   rP   rV   rQ   r   r   r   r   r      s    CL
	r   )
rc   r'   Úpyexcel._compactÚ_compactr   Ú r   r
   rW   r   r   r   r   r   Ú<module>   s
    	